Merge pull request #9819 from ethereum/fix-static-arrays-of-dynamic-elements-not-treated-as-dynamic

Fix static arrays with dynamic elements not being treated as dynamic in returnParameterTypesWithoutDynamicTypes()
This commit is contained in:
chriseth authored and GitHub committed 2020-09-16 12:33:25 +02:00
commit 79201f8834
3 files changed
+25 -1

No files matched your search

+1
View File
@@ -16,6 +16,7 @@ Compiler Features:
Bugfixes:
* Code generator: Fix internal error on stripping dynamic types from return parameters on EVM versions without ``RETURNDATACOPY``.
* Type Checker: Disallow ``virtual`` for modifiers in libraries.
* Type Checker: Correct the warning for homonymous, but not shadowing declarations.
* ViewPureChecker: Prevent visibility check on constructors.
+1 -1
View File
@@ -3010,7 +3010,7 @@ TypePointers FunctionType::returnParameterTypesWithoutDynamicTypes() const
m_kind == Kind::BareStaticCall
)
for (auto& param: returnParameterTypes)
if (param->isDynamicallySized() && !param->dataStoredIn(DataLocation::Storage))
if (param->isDynamicallyEncoded() && !param->dataStoredIn(DataLocation::Storage))
param = TypeProvider::inaccessibleDynamic();
return returnParameterTypes;
@@ -0,0 +1,23 @@
pragma experimental ABIEncoderV2;
contract C {
struct S {
bool[] b;
}
function f() public returns (uint256, bool[][2] memory, S[2] memory, uint256) {
return (
5,
[new bool[](1), new bool[](2)],
[S(new bool[](2)), S(new bool[](5))],
6
);
}
function g() public returns (uint256, uint256) {
(uint256 a, , , uint256 b) = this.f();
return (a, b);
}
}
// ----
// g() -> 5, 6