From cb49b914f061e3e530852e8a4bc3043e3c35b59b Mon Sep 17 00:00:00 2001 From: a3d4 Date: Sun, 30 Aug 2020 16:40:02 +0200 Subject: [PATCH] Fix ICE caused by an array of mappings --- libsolidity/analysis/TypeChecker.cpp | 4 ++++ test/libsolidity/SolidityNameAndTypeResolution.cpp | 2 +- test/libsolidity/syntaxTests/array/function_mapping.sol | 1 + .../syntaxTests/array/function_mapping_library.sol | 1 + test/libsolidity/syntaxTests/cycle_checker_function_type.sol | 2 +- .../syntaxTests/iceRegressionTests/memory_mapping_array.sol | 1 + .../iceRegressionTests/recursive_struct_memory.sol | 1 + .../memory_structs_with_mapping_array_struct_array.sol | 2 ++ ...ith_structs_of_non_external_types_in_interface_nested.sol | 1 + ...with_stucts_of_non_external_types_in_interface_nested.sol | 1 + .../207_no_mappings_in_memory_array.sol | 1 + .../211_uninitialized_mapping_array_variable.sol | 2 +- test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol | 3 +++ test/libsolidity/syntaxTests/parsing/multi_arrays.sol | 2 ++ .../syntaxTests/types/mapping/array_argument_internal.sol | 1 + .../syntaxTests/types/mapping/array_argument_private.sol | 1 + .../types/mapping/function_type_argument_array.sol | 1 + .../types/mapping/library_array_argument_external.sol | 1 + .../types/mapping/library_array_argument_internal.sol | 2 ++ .../types/mapping/library_array_argument_private.sol | 2 ++ .../types/mapping/library_array_argument_public.sol | 1 + .../syntaxTests/types/mapping/library_nested_storage.sol | 1 + .../mapping_array_data_location_function_param_external.sol | 1 + .../types/mapping/mapping_array_return_internal.sol | 5 +++++ .../syntaxTests/types/mapping/memory_struct_recursive.sol | 3 +++ 25 files changed, 40 insertions(+), 3 deletions(-) diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 990192d6802e..a5c8025ea4a2 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -502,6 +502,10 @@ bool TypeChecker::visit(VariableDeclaration const& _variable) if (auto contractType = dynamic_cast(varType)) if (contractType->contractDefinition().isLibrary()) m_errorReporter.typeError(1273_error, _variable.location(), "The type of a variable cannot be a library."); + if (auto arrayType = dynamic_cast(varType)) + if (arrayType->containsNestedMapping()) + m_errorReporter.typeError(1946_error, _variable.location(), "Arrays containing (nested) mappings are not allowed."); + if (_variable.value()) { if (_variable.isStateVariable() && varType->containsNestedMapping()) diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 65a8026a48e0..aa55100a2677 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -260,7 +260,7 @@ BOOST_AUTO_TEST_CASE(struct_with_mapping_in_library) { char const* text = R"( library Test { - struct Nested { mapping(uint => uint)[2][] a; uint y; } + struct Nested { mapping(uint => uint) a; uint y; } struct X { Nested n; } function f(X storage x) external {} } diff --git a/test/libsolidity/syntaxTests/array/function_mapping.sol b/test/libsolidity/syntaxTests/array/function_mapping.sol index 934c7ebd818b..0b50f59be9bf 100644 --- a/test/libsolidity/syntaxTests/array/function_mapping.sol +++ b/test/libsolidity/syntaxTests/array/function_mapping.sol @@ -5,4 +5,5 @@ contract Test { } // ---- // TypeError 4103: (66-98): Types containing (nested) mappings can only be parameters or return variables of internal or library functions. +// TypeError 1946: (66-98): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (66-98): Type mapping(uint256 => uint256)[] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/array/function_mapping_library.sol b/test/libsolidity/syntaxTests/array/function_mapping_library.sol index fb709292a836..24d35ce73443 100644 --- a/test/libsolidity/syntaxTests/array/function_mapping_library.sol +++ b/test/libsolidity/syntaxTests/array/function_mapping_library.sol @@ -3,4 +3,5 @@ library L { function f(mapping(uint => uint)[2] memory a) external pure returns (mapping(uint => uint)[2] memory) {} } // ---- +// TypeError 1946: (61-94): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (61-94): Type mapping(uint256 => uint256)[2] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/cycle_checker_function_type.sol b/test/libsolidity/syntaxTests/cycle_checker_function_type.sol index 7e3e86be492a..72d991cdcb7b 100644 --- a/test/libsolidity/syntaxTests/cycle_checker_function_type.sol +++ b/test/libsolidity/syntaxTests/cycle_checker_function_type.sol @@ -3,4 +3,4 @@ contract C { function ( ) internal returns ( bytes [ ] storage , mapping ( bytes => mapping ( bytes => mapping ( uint => mapping ( bytes => mapping ( string => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( string => mapping ( string => mapping ( uint => mapping ( bytes => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( bytes => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( uint => mapping ( string => mapping ( uint => string ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) [ ] storage ) constant c = c ; } // ---- -// TypeError 6161: (43-643): The value of the constant c has a cyclic dependency via c. +// TypeError 1946: (95-626): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/iceRegressionTests/memory_mapping_array.sol b/test/libsolidity/syntaxTests/iceRegressionTests/memory_mapping_array.sol index aa1f63e4ce0c..fb1158729a2c 100644 --- a/test/libsolidity/syntaxTests/iceRegressionTests/memory_mapping_array.sol +++ b/test/libsolidity/syntaxTests/iceRegressionTests/memory_mapping_array.sol @@ -4,4 +4,5 @@ } } // ---- +// TypeError 1946: (91-136): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (91-136): Type mapping(string => uint24)[1] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/iceRegressionTests/recursive_struct_memory.sol b/test/libsolidity/syntaxTests/iceRegressionTests/recursive_struct_memory.sol index 892cfdd8d326..290e98b000cf 100644 --- a/test/libsolidity/syntaxTests/iceRegressionTests/recursive_struct_memory.sol +++ b/test/libsolidity/syntaxTests/iceRegressionTests/recursive_struct_memory.sol @@ -11,4 +11,5 @@ contract Test { } // ---- // DeclarationError 2333: (157-198): Identifier already declared. +// TypeError 1946: (268-300): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (268-300): Type struct Test.RecursiveStruct[1] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/memberLookup/memory_structs_with_mapping_array_struct_array.sol b/test/libsolidity/syntaxTests/memberLookup/memory_structs_with_mapping_array_struct_array.sol index 164d32ff017a..c000dfa41dea 100644 --- a/test/libsolidity/syntaxTests/memberLookup/memory_structs_with_mapping_array_struct_array.sol +++ b/test/libsolidity/syntaxTests/memberLookup/memory_structs_with_mapping_array_struct_array.sol @@ -9,4 +9,6 @@ contract Test { } } // ---- +// TypeError 1946: (38-64): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (99-106): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (161-172): Type struct Test.S2 is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_structs_of_non_external_types_in_interface_nested.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_structs_of_non_external_types_in_interface_nested.sol index d2c96d4bc8d0..6fa9bf317691 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_structs_of_non_external_types_in_interface_nested.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_structs_of_non_external_types_in_interface_nested.sol @@ -6,5 +6,6 @@ contract C { function f(S memory) public {} } // ---- +// TypeError 1946: (105-113): Arrays containing (nested) mappings are not allowed. // TypeError 4103: (132-140): Types containing (nested) mappings can only be parameters or return variables of internal or library functions. // TypeError 4061: (132-140): Type struct C.S is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol index d2c96d4bc8d0..6fa9bf317691 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol @@ -6,5 +6,6 @@ contract C { function f(S memory) public {} } // ---- +// TypeError 1946: (105-113): Arrays containing (nested) mappings are not allowed. // TypeError 4103: (132-140): Types containing (nested) mappings can only be parameters or return variables of internal or library functions. // TypeError 4061: (132-140): Type struct C.S is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/207_no_mappings_in_memory_array.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/207_no_mappings_in_memory_array.sol index d9e929da2af1..674b26975769 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/207_no_mappings_in_memory_array.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/207_no_mappings_in_memory_array.sol @@ -4,4 +4,5 @@ contract C { } } // ---- +// TypeError 1946: (47-77): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (47-77): Type mapping(uint256 => uint256)[] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol index 16ac9ac1caad..6c3274c2cfa0 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol @@ -5,4 +5,4 @@ contract C { } } // ---- -// TypeError 3464: (95-96): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. +// TypeError 1946: (52-85): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol b/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol index 9adf6f125665..1110c62536f3 100644 --- a/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol +++ b/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol @@ -4,3 +4,6 @@ contract c { struct x { uint[2**20] b; y[1] c; } struct y { uint d; mapping(uint=>x)[] e; } } +// ---- +// TypeError 1946: (74-80): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (107-127): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/parsing/multi_arrays.sol b/test/libsolidity/syntaxTests/parsing/multi_arrays.sol index ef20ecee6200..9232ef46c8f5 100644 --- a/test/libsolidity/syntaxTests/parsing/multi_arrays.sol +++ b/test/libsolidity/syntaxTests/parsing/multi_arrays.sol @@ -1,3 +1,5 @@ contract c { mapping(uint => mapping(uint => int8)[8][][9])[] x; } +// ---- +// TypeError 1946: (17-67): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/array_argument_internal.sol b/test/libsolidity/syntaxTests/types/mapping/array_argument_internal.sol index 352d09823f1b..d8bb4e6bb189 100644 --- a/test/libsolidity/syntaxTests/types/mapping/array_argument_internal.sol +++ b/test/libsolidity/syntaxTests/types/mapping/array_argument_internal.sol @@ -3,3 +3,4 @@ contract C { } } // ---- +// TypeError 1946: (28-59): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/array_argument_private.sol b/test/libsolidity/syntaxTests/types/mapping/array_argument_private.sol index 332dbe6c0641..4e6845a0ccfe 100644 --- a/test/libsolidity/syntaxTests/types/mapping/array_argument_private.sol +++ b/test/libsolidity/syntaxTests/types/mapping/array_argument_private.sol @@ -3,3 +3,4 @@ contract C { } } // ---- +// TypeError 1946: (28-59): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/function_type_argument_array.sol b/test/libsolidity/syntaxTests/types/mapping/function_type_argument_array.sol index e7587ad0cfc7..ea1a1328e58f 100644 --- a/test/libsolidity/syntaxTests/types/mapping/function_type_argument_array.sol +++ b/test/libsolidity/syntaxTests/types/mapping/function_type_argument_array.sol @@ -3,4 +3,5 @@ contract test { } } // ---- +// TypeError 1946: (31-64): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (31-64): Type mapping(uint256 => uint256)[2] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol index ca875546e9b1..c7ab017f74d9 100644 --- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol +++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol @@ -3,3 +3,4 @@ library L { } } // ---- +// TypeError 1946: (27-58): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_internal.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_internal.sol index 55c1cea04130..0db8739cbf8f 100644 --- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_internal.sol +++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_internal.sol @@ -2,3 +2,5 @@ library L { function f(mapping(uint => uint)[] storage) internal pure { } } +// ---- +// TypeError 1946: (27-58): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_private.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_private.sol index d37d650454b9..0778a5065f51 100644 --- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_private.sol +++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_private.sol @@ -2,3 +2,5 @@ library L { function f(mapping(uint => uint)[] storage) private pure { } } +// ---- +// TypeError 1946: (27-58): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol index 03ca40145aa1..dbd788f3a338 100644 --- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol +++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol @@ -3,3 +3,4 @@ library L { } } // ---- +// TypeError 1946: (27-58): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/library_nested_storage.sol b/test/libsolidity/syntaxTests/types/mapping/library_nested_storage.sol index 11b09ce25ee8..2561f237757e 100644 --- a/test/libsolidity/syntaxTests/types/mapping/library_nested_storage.sol +++ b/test/libsolidity/syntaxTests/types/mapping/library_nested_storage.sol @@ -4,3 +4,4 @@ library Test { function f(X storage x) external {} } // ---- +// TypeError 1946: (35-63): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol index 72c2a12a8518..af21acfbccec 100644 --- a/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol +++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol @@ -3,4 +3,5 @@ contract c { } // ---- // TypeError 4103: (29-61): Types containing (nested) mappings can only be parameters or return variables of internal or library functions. +// TypeError 1946: (29-61): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (29-61): Type mapping(uint256 => uint256)[] is only valid in storage because it contains a (nested) mapping. diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_internal.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_internal.sol index 8837c745b29f..f4dee4b6dc97 100644 --- a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_internal.sol +++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_internal.sol @@ -14,3 +14,8 @@ contract C { } } // ---- +// TypeError 1946: (17-40): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (82-111): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (178-207): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (275-306): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (370-401): Arrays containing (nested) mappings are not allowed. diff --git a/test/libsolidity/syntaxTests/types/mapping/memory_struct_recursive.sol b/test/libsolidity/syntaxTests/types/mapping/memory_struct_recursive.sol index c6f8f48f3c10..0770a6bab64a 100644 --- a/test/libsolidity/syntaxTests/types/mapping/memory_struct_recursive.sol +++ b/test/libsolidity/syntaxTests/types/mapping/memory_struct_recursive.sol @@ -17,4 +17,7 @@ contract Test { } } // ---- +// TypeError 1946: (30-35): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (55-60): Arrays containing (nested) mappings are not allowed. +// TypeError 1946: (80-85): Arrays containing (nested) mappings are not allowed. // TypeError 4061: (143-153): Type struct Test.S is only valid in storage because it contains a (nested) mapping.