aboutsummaryrefslogtreecommitdiffstats
path: root/AST.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-07-16 07:06:19 +0800
committerchriseth <c@ethdev.com>2015-07-16 07:10:09 +0800
commita2796c3d15593d9744433dbfb35d166c07e3dec6 (patch)
treee51e8932396b808915468fc09f6889174a8b7e96 /AST.cpp
parentd747f34466ed6b3f3be0ea0c0d5278a7670e4d57 (diff)
downloaddexon-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.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/AST.cpp b/AST.cpp
index 0cca63a8..3a83058c 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -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 "