mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #12928 from StrongerXi/expand-purity-check-for-foreign-constants
Propagate purity information for member access to foreign pure variables
This commit is contained in:
commit
b80f4baae2
@ -4,7 +4,7 @@ Language Features:
|
||||
|
||||
|
||||
Compiler Features:
|
||||
|
||||
* TypeChecker: Support using library constants in initializers of other constants.
|
||||
|
||||
Bugfixes:
|
||||
* Commandline Interface: Disallow the following options outside of the compiler mode: ``--via-ir``,``--metadata-literal``, ``--metadata-hash``, ``--model-checker-show-unproved``, ``--model-checker-div-mod-no-slacks``, ``--model-checker-engine``, ``--model-checker-invariants``, ``--model-checker-solvers``, ``--model-checker-timeout``, ``--model-checker-contracts``, ``--model-checker-targets``.
|
||||
|
@ -3214,6 +3214,13 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
|
||||
|
||||
annotation.isPure = isPure;
|
||||
}
|
||||
if (
|
||||
auto const* varDecl = dynamic_cast<VariableDeclaration const*>(annotation.referencedDeclaration);
|
||||
!annotation.isPure.set() &&
|
||||
varDecl &&
|
||||
varDecl->isConstant()
|
||||
)
|
||||
annotation.isPure = true;
|
||||
|
||||
if (auto magicType = dynamic_cast<MagicType const*>(exprType))
|
||||
{
|
||||
|
@ -0,0 +1,29 @@
|
||||
uint256 constant MAX = 1;
|
||||
|
||||
library L1 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
contract C1 {
|
||||
uint256 internal constant CONST1 = L1.INT;
|
||||
|
||||
uint256[L1.INT] internal arr1; // error, backward reference
|
||||
uint256[L2.INT] internal arr2; // error, forward reference
|
||||
}
|
||||
|
||||
contract C2 is C1 {
|
||||
uint256 internal constant CONST2 = CONST1;
|
||||
|
||||
uint256[CONST1] internal arr3; // error, inherited constants
|
||||
uint256[CONST2] internal arr4; // error, same contract constant
|
||||
}
|
||||
|
||||
library L2 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
// ----
|
||||
// TypeError 5462: (158-164): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (222-228): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (356-362): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (421-427): Invalid array length, expected integer literal or constant expression.
|
@ -0,0 +1,35 @@
|
||||
uint256 constant MAX = 1;
|
||||
|
||||
library L1 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
contract C1 {
|
||||
uint256 internal constant CONST = 20 + L2.INT; // forward reference
|
||||
uint256 internal constant LIMIT = MAX * L1.INT; // same file & external library constant
|
||||
uint256 internal constant NESTED = LIMIT + CONST; // nested & same contract constant
|
||||
|
||||
uint256[L1.INT] internal arr1; // error, backward reference
|
||||
uint256[L2.INT] internal arr2; // error, forward reference
|
||||
}
|
||||
|
||||
contract C2 is C1 {
|
||||
uint256 internal constant INHERITED = NESTED + CONST * LIMIT; // inherited constants
|
||||
}
|
||||
|
||||
contract C3 is C2 {
|
||||
uint256 internal constant NESTED_INHERITED = INHERITED + NESTED + CONST * LIMIT; // nest-inherited constants
|
||||
|
||||
uint256[CONST] internal arr3; // error, nest-inherited constants
|
||||
uint256[NESTED_INHERITED] internal arr4; // error, same contract constant
|
||||
}
|
||||
|
||||
library L2 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
// ----
|
||||
// TypeError 5462: (366-372): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (430-436): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (742-747): Invalid array length, expected integer literal or constant expression.
|
||||
// TypeError 5462: (822-838): Invalid array length, expected integer literal or constant expression.
|
@ -0,0 +1,25 @@
|
||||
uint256 constant MAX = 1;
|
||||
|
||||
library L1 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
contract C1 {
|
||||
uint256 internal constant CONST = 20 + L2.INT; // forward reference
|
||||
uint256 internal constant LIMIT = MAX * L1.INT; // same file & external library constant
|
||||
uint256 internal constant NESTED = LIMIT + CONST; // nested & same contract constant
|
||||
}
|
||||
|
||||
contract C2 is C1 {
|
||||
uint256 internal constant INHERITED = NESTED + CONST * LIMIT; // inherited constants
|
||||
}
|
||||
|
||||
contract C3 is C2 {
|
||||
uint256 internal constant NESTED_INHERITED = INHERITED + NESTED + CONST * LIMIT; // nest-inherited constants
|
||||
}
|
||||
|
||||
library L2 {
|
||||
uint256 internal constant INT = 100;
|
||||
}
|
||||
|
||||
// ----
|
@ -0,0 +1,11 @@
|
||||
==== Source: A.sol ====
|
||||
import "B.sol" as B;
|
||||
|
||||
uint constant X = 1;
|
||||
uint constant Y = B.Y;
|
||||
|
||||
==== Source: B.sol ====
|
||||
import "A.sol" as A;
|
||||
|
||||
uint constant X = A.X;
|
||||
uint constant Y = 2;
|
@ -0,0 +1,17 @@
|
||||
==== Source: A.sol ====
|
||||
import "B.sol";
|
||||
|
||||
library L {
|
||||
uint constant X = 1;
|
||||
uint constant Y = K.Y;
|
||||
}
|
||||
|
||||
==== Source: B.sol ====
|
||||
import "A.sol";
|
||||
|
||||
library K {
|
||||
uint constant X = L.X;
|
||||
uint constant Y = 2;
|
||||
}
|
||||
|
||||
// ====
|
@ -0,0 +1,15 @@
|
||||
==== Source: A.sol ====
|
||||
import "B.sol";
|
||||
|
||||
uint256 constant A = B.VAL + 1;
|
||||
|
||||
==== Source: B.sol ====
|
||||
import "A.sol";
|
||||
|
||||
library B {
|
||||
uint256 constant VAL = A + 1;
|
||||
}
|
||||
|
||||
// ----
|
||||
// TypeError 6161: (B.sol:33-61): The value of the constant VAL has a cyclic dependency via A.
|
||||
// TypeError 6161: (A.sol:17-47): The value of the constant A has a cyclic dependency via VAL.
|
@ -0,0 +1,13 @@
|
||||
==== Source: A.sol ====
|
||||
import "B.sol";
|
||||
|
||||
uint256 constant A = B + 1;
|
||||
|
||||
==== Source: B.sol ====
|
||||
import "A.sol";
|
||||
|
||||
uint256 constant B = A + 1;
|
||||
|
||||
// ----
|
||||
// TypeError 6161: (B.sol:17-43): The value of the constant B has a cyclic dependency via A.
|
||||
// TypeError 6161: (A.sol:17-43): The value of the constant A has a cyclic dependency via B.
|
@ -0,0 +1,11 @@
|
||||
library A {
|
||||
uint256 constant VAL = B.VAL + 1;
|
||||
}
|
||||
|
||||
library B {
|
||||
uint256 constant VAL = A.VAL + 1;
|
||||
}
|
||||
|
||||
// ----
|
||||
// TypeError 6161: (16-48): The value of the constant VAL has a cyclic dependency via VAL.
|
||||
// TypeError 6161: (69-101): The value of the constant VAL has a cyclic dependency via VAL.
|
Loading…
Reference in New Issue
Block a user