Fix static arrays with dynamic elements not being treated as dynamic in FunctionType::returnParameterTypesWithoutDynamicTypes()

This commit is contained in:
Kamil Śliwak 2020-09-16 10:51:15 +02:00
parent b08b76ffca
commit 2916ae5bda
3 changed files with 25 additions and 1 deletions

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.

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;

View File

@ -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