Merge pull request #9702 from a3d4/fix-7410-arrays-of-mappings

Fix ICE caused by an array of mappings
This commit is contained in:
chriseth 2020-09-30 20:24:09 +02:00 committed by GitHub
commit 3af21c92d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 1 deletions

View File

@ -7,6 +7,10 @@ Compiler Features:
* General: Option to stop compilation after parsing stage. Can be used with ``solc --stop-after parsing``
Bugfixes:
* Type Checker: Fix internal compiler error when calling `.push(<arg>)` for a storage array with a nested mapping.
### 0.7.2 (2020-09-28)
Important Bugfixes:

View File

@ -2684,10 +2684,20 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
"Using \"." + memberName + "(...)\" is deprecated. Use \"{" + memberName + ": ...}\" instead."
);
if (
funType->kind() == FunctionType::Kind::ArrayPush &&
arguments.value().numArguments() != 0 &&
exprType->containsNestedMapping()
)
m_errorReporter.typeError(
8871_error,
_memberAccess.location(),
"Storage arrays with nested mappings do not support .push(<arg>)."
);
if (!funType->bound())
if (auto contractType = dynamic_cast<ContractType const*>(exprType))
requiredLookup = contractType->isSuper() ? VirtualLookup::Super : VirtualLookup::Virtual;
}
annotation.requiredLookup = requiredLookup;

View File

@ -0,0 +1,7 @@
contract C {
mapping(uint=>uint)[] array;
mapping(uint=>uint) map;
function f() public {
array.pop();
}
}

View File

@ -0,0 +1,10 @@
contract C {
mapping(uint=>uint)[] array;
mapping(uint=>uint) map;
function f() public {
array.push();
array.push(map);
}
}
// ----
// TypeError 8871: (131-141): Storage arrays with nested mappings do not support .push(<arg>).