mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Propagate purity information for member access to foreign pure variables
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
// ----
|
||||
+11
@@ -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;
|
||||
+17
@@ -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;
|
||||
}
|
||||
|
||||
// ====
|
||||
+15
@@ -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.
|
||||
Reference in New Issue
Block a user