diff options
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 5 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/array/multi_dim_zero_length.sol | 6 |
2 files changed, 11 insertions, 0 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 3056561b..3b5e7b11 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -822,12 +822,17 @@ bool TypeChecker::visit(VariableDeclaration const& _variable) { case Type::Category::Array: if (auto arrayType = dynamic_cast<ArrayType const*>(varType.get())) + { if ( ((arrayType->location() == DataLocation::Memory) || (arrayType->location() == DataLocation::CallData)) && !arrayType->validForCalldata() ) m_errorReporter.typeError(_variable.location(), "Array is too large to be encoded."); + if (auto baseType = dynamic_cast<ArrayType const*>(arrayType->baseType().get())) + if (!baseType->isDynamicallySized() && baseType->length() == 0) + m_errorReporter.typeError(_variable.location(), "Fixed-size multidimensional arrays are not allowed to have zero length."); + } break; case Type::Category::Mapping: if (auto mappingType = dynamic_cast<MappingType const*>(varType.get())) diff --git a/test/libsolidity/syntaxTests/array/multi_dim_zero_length.sol b/test/libsolidity/syntaxTests/array/multi_dim_zero_length.sol new file mode 100644 index 00000000..2f487cde --- /dev/null +++ b/test/libsolidity/syntaxTests/array/multi_dim_zero_length.sol @@ -0,0 +1,6 @@ +contract C { + bytes[0] a; + function f() public pure returns(bytes32[0][500] memory) {} +} +// ---- +// TypeError: (62-84): Fixed-size multidimensional arrays are not allowed to have zero length. |