diff options
author | chriseth <c@ethdev.com> | 2015-07-16 07:06:19 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-07-16 07:10:09 +0800 |
commit | a2796c3d15593d9744433dbfb35d166c07e3dec6 (patch) | |
tree | e51e8932396b808915468fc09f6889174a8b7e96 /AST.cpp | |
parent | d747f34466ed6b3f3be0ea0c0d5278a7670e4d57 (diff) | |
download | dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar.gz dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar.bz2 dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar.lz dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar.xz dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.tar.zst dexon-solidity-a2796c3d15593d9744433dbfb35d166c07e3dec6.zip |
Allow structs containing mappings in memory.
Diffstat (limited to 'AST.cpp')
-rw-r--r-- | AST.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
@@ -830,11 +830,14 @@ void FunctionCall::checkTypeRequirements(TypePointers const*) return; } + /// For error message: Struct members that were removed during conversion to memory. + set<string> membersRemovedForStructConstructor; if (isStructConstructorCall()) { TypeType const& type = dynamic_cast<TypeType const&>(*expressionType); auto const& structType = dynamic_cast<StructType const&>(*type.getActualType()); functionType = structType.constructorType(); + membersRemovedForStructConstructor = structType.membersMissingInMemory(); } else functionType = dynamic_pointer_cast<FunctionType const>(expressionType); @@ -847,13 +850,22 @@ void FunctionCall::checkTypeRequirements(TypePointers const*) // function parameters TypePointers const& parameterTypes = functionType->getParameterTypes(); if (!functionType->takesArbitraryParameters() && parameterTypes.size() != m_arguments.size()) - BOOST_THROW_EXCEPTION(createTypeError( + { + string msg = "Wrong argument count for function call: " + toString(m_arguments.size()) + " arguments given but expected " + toString(parameterTypes.size()) + - "." - )); + "."; + // Extend error message in case we try to construct a struct with mapping member. + if (isStructConstructorCall() && !membersRemovedForStructConstructor.empty()) + { + msg += " Members that have to be skipped in memory:"; + for (auto const& member: membersRemovedForStructConstructor) + msg += " " + member; + } + BOOST_THROW_EXCEPTION(createTypeError(msg)); + } if (isPositionalCall) { @@ -972,10 +984,22 @@ void MemberAccess::checkTypeRequirements(TypePointers const* _argumentTypes) ++it; } if (possibleMembers.size() == 0) + { + auto storageType = ReferenceType::copyForLocationIfReference( + DataLocation::Storage, + m_expression->getType() + ); + if (!storageType->getMembers().membersByName(*m_memberName).empty()) + BOOST_THROW_EXCEPTION(createTypeError( + "Member \"" + *m_memberName + "\" is not available in " + + type.toString() + + " outside of storage." + )); BOOST_THROW_EXCEPTION(createTypeError( "Member \"" + *m_memberName + "\" not found or not visible " "after argument-dependent lookup in " + type.toString() )); + } else if (possibleMembers.size() > 1) BOOST_THROW_EXCEPTION(createTypeError( "Member \"" + *m_memberName + "\" not unique " |