diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 5980f93668b8..820c5ca20ee8 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -2817,9 +2817,6 @@ FunctionType::FunctionType(VariableDeclaration const& _varDecl): solAssert(member.type, ""); if (member.type->category() != Category::Mapping) { - if (auto arrayType = dynamic_cast(member.type)) - if (!arrayType->isByteArrayOrString()) - continue; m_returnParameterTypes.push_back(TypeProvider::withLocationIfReference( DataLocation::Memory, member.type diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 461de5648d25..208c3104f05c 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -237,11 +237,6 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const& // struct for (size_t i = 0; i < names.size(); ++i) { - if (returnTypes[i]->category() == Type::Category::Mapping) - continue; - if (auto arrayType = dynamic_cast(returnTypes[i])) - if (!arrayType->isByteArrayOrString()) - continue; pair const& offsets = structType->storageOffsetsOfMember(names[i]); m_context << Instruction::DUP1 << u256(offsets.first) << Instruction::ADD << u256(offsets.second); Type const* memberType = structType->memberType(names[i]); diff --git a/test/libsolidity/ABIJson/struct_with_array_mapping.sol b/test/libsolidity/ABIJson/struct_with_array_mapping.sol new file mode 100644 index 000000000000..d671f9d7e281 --- /dev/null +++ b/test/libsolidity/ABIJson/struct_with_array_mapping.sol @@ -0,0 +1,38 @@ +pragma abicoder v2; +contract test { + struct Str { + uint[] a; + uint b; + } + mapping(uint => Str) public mappedData; +} +// ---- +// :test +// [ +// { +// "inputs": +// [ +// { +// "internalType": "uint256", +// "name": "", +// "type": "uint256" +// } +// ], +// "name": "mappedData", +// "outputs": +// [ +// { +// "internalType": "uint256[]", +// "name": "a", +// "type": "uint256[]" +// }, +// { +// "internalType": "uint256", +// "name": "b", +// "type": "uint256" +// } +// ], +// "stateMutability": "view", +// "type": "function" +// } +// ] diff --git a/test/libsolidity/semanticTests/storage/array_accessor.sol b/test/libsolidity/semanticTests/storage/array_accessor.sol index 599931a372c7..fd32d1835a43 100644 --- a/test/libsolidity/semanticTests/storage/array_accessor.sol +++ b/test/libsolidity/semanticTests/storage/array_accessor.sol @@ -17,9 +17,11 @@ contract test { smallTypeData[127] = 2; multiple_map[2][1][2].a = 3; - for (uint i = 0; i < 4; i++) - multiple_map[2][1][2].finalArray.push(); - multiple_map[2][1][2].finalArray[3] = 5; + // for (uint i = 0; i < 4; i++) + // multiple_map[2][1][2].finalArray.push(); + // multiple_map[2][1][2].finalArray[3] = 5; + + // multiple_map(uint256,uint256,uint256): 2, 1, 2, 3 -> 0, 0, 0, 0, 5 } } // ---- @@ -30,4 +32,4 @@ contract test { // smallTypeData(uint256): 1 -> 22 // smallTypeData(uint256): 127 -> 2 // smallTypeData(uint256): 128 -> FAILURE -// multiple_map(uint256,uint256,uint256): 2, 1, 2 -> 3 +// multiple_map(uint256,uint256,uint256): 2, 1, 2 -> 3 \ No newline at end of file diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/070_struct_accessor_one_array_only.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/070_struct_accessor_one_array_only.sol index 79e7f17fc2aa..64c1f529a0f5 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/070_struct_accessor_one_array_only.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/070_struct_accessor_one_array_only.sol @@ -3,4 +3,3 @@ contract test { Data public data; } // ---- -// TypeError 5359: (58-74): The struct has all its members omitted, therefore the getter cannot return any values.