Merge pull request #9959 from a3d4/fix-ice-struct-with-mapping-assignment

Fix ICE caused by const structs with mappings
This commit is contained in:
chriseth 2021-01-13 15:19:02 +01:00 committed by GitHub
commit 6eea2f5c08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 35 additions and 16 deletions

View File

@ -18,6 +18,7 @@ Bugfixes:
* SMTChecker: Fix false negatives when analyzing external function calls. * SMTChecker: Fix false negatives when analyzing external function calls.
* SMTChecker: Fix missing type constraints for block variables. * SMTChecker: Fix missing type constraints for block variables.
* SMTChecker: Fix internal error on ``block.chainid``. * SMTChecker: Fix internal error on ``block.chainid``.
* Type Checker: Fix internal error caused by constant structs containing mappings.
* Type System: Disallow implicit conversion from ``uintN`` to ``intM`` when ``M > N``, and by extension, explicit conversion between the same types is also disallowed. * Type System: Disallow implicit conversion from ``uintN`` to ``intM`` when ``M > N``, and by extension, explicit conversion between the same types is also disallowed.
### 0.8.0 (2020-12-16) ### 0.8.0 (2020-12-16)

View File

@ -412,6 +412,15 @@ void DeclarationTypeChecker::endVisit(VariableDeclaration const& _variable)
type = TypeProvider::withLocation(ref, typeLoc, isPointer); type = TypeProvider::withLocation(ref, typeLoc, isPointer);
} }
if (_variable.isConstant() && !type->isValueType())
{
bool allowed = false;
if (auto arrayType = dynamic_cast<ArrayType const*>(type))
allowed = arrayType->isByteArray();
if (!allowed)
m_errorReporter.fatalDeclarationError(9259_error, _variable.location(), "Constants of non-value type not yet implemented.");
}
_variable.annotation().type = type; _variable.annotation().type = type;
} }

View File

@ -521,15 +521,6 @@ bool TypeChecker::visit(VariableDeclaration const& _variable)
} }
if (_variable.isConstant()) if (_variable.isConstant())
{ {
if (!_variable.type()->isValueType())
{
bool allowed = false;
if (auto arrayType = dynamic_cast<ArrayType const*>(_variable.type()))
allowed = arrayType->isByteArray();
if (!allowed)
m_errorReporter.typeError(9259_error, _variable.location(), "Constants of non-value type not yet implemented.");
}
if (!_variable.value()) if (!_variable.value())
m_errorReporter.typeError(4266_error, _variable.location(), "Uninitialized \"constant\" variable."); m_errorReporter.typeError(4266_error, _variable.location(), "Uninitialized \"constant\" variable.");
else if (!*_variable.value()->annotation().isPure) else if (!*_variable.value()->annotation().isPure)

View File

@ -1,3 +1,4 @@
int[L] constant L = 6; int[L] constant L = 6;
// ---- // ----
// TypeError 5462: (4-5): Invalid array length, expected integer literal or constant expression. // TypeError 5462: (4-5): Invalid array length, expected integer literal or constant expression.
// DeclarationError 9259: (0-21): Constants of non-value type not yet implemented.

View File

@ -3,3 +3,4 @@ contract C {
} }
// ---- // ----
// TypeError 5462: (21-22): Invalid array length, expected integer literal or constant expression. // TypeError 5462: (21-22): Invalid array length, expected integer literal or constant expression.
// DeclarationError 9259: (17-38): Constants of non-value type not yet implemented.

View File

@ -1,3 +1,3 @@
mapping(uint => uint) constant b = b; mapping(uint => uint) constant b = b;
// ---- // ----
// TypeError 9259: (0-36): Constants of non-value type not yet implemented. // DeclarationError 9259: (0-36): Constants of non-value type not yet implemented.

View File

@ -1,5 +1,4 @@
struct S { uint x; } struct S { uint x; }
S constant s; S constant s;
// ---- // ----
// TypeError 9259: (21-33): Constants of non-value type not yet implemented. // DeclarationError 9259: (21-33): Constants of non-value type not yet implemented.
// TypeError 4266: (21-33): Uninitialized "constant" variable.

View File

@ -0,0 +1,8 @@
contract C {
struct S {
mapping(uint => uint) c;
}
S public constant e = 0x1212121212121212121212121212121212121212;
}
// ----
// DeclarationError 9259: (71-135): Constants of non-value type not yet implemented.

View File

@ -3,3 +3,4 @@ contract test {
} }
// ---- // ----
// DeclarationError 1788: (31-55): The "constant" keyword can only be used for state variables or variables at file level. // DeclarationError 1788: (31-55): The "constant" keyword can only be used for state variables or variables at file level.
// DeclarationError 9259: (31-55): Constants of non-value type not yet implemented.

View File

@ -2,4 +2,4 @@ contract C {
uint[3] constant x = [uint(1), 2, 3]; uint[3] constant x = [uint(1), 2, 3];
} }
// ---- // ----
// TypeError 9259: (17-53): Constants of non-value type not yet implemented. // DeclarationError 9259: (17-53): Constants of non-value type not yet implemented.

View File

@ -3,4 +3,4 @@ contract C {
S constant x = S(5, new uint[](4)); S constant x = S(5, new uint[](4));
} }
// ---- // ----
// TypeError 9259: (52-86): Constants of non-value type not yet implemented. // DeclarationError 9259: (52-86): Constants of non-value type not yet implemented.

View File

@ -4,5 +4,4 @@ contract C {
mapping(uint => uint) constant x; mapping(uint => uint) constant x;
} }
// ---- // ----
// TypeError 9259: (148-180): Constants of non-value type not yet implemented. // DeclarationError 9259: (148-180): Constants of non-value type not yet implemented.
// TypeError 4266: (148-180): Uninitialized "constant" variable.

View File

@ -0,0 +1,8 @@
contract C {
struct S {
mapping(uint => uint) x;
}
S public constant c;
}
// ----
// DeclarationError 9259: (71-90): Constants of non-value type not yet implemented.

View File

@ -3,3 +3,4 @@ contract Foo {
} }
// ---- // ----
// DeclarationError 1788: (30-55): The "constant" keyword can only be used for state variables or variables at file level. // DeclarationError 1788: (30-55): The "constant" keyword can only be used for state variables or variables at file level.
// DeclarationError 9259: (30-55): Constants of non-value type not yet implemented.