Support referencing other constants in inline assembly

This commit is contained in:
Gaith Hallak
2019-12-05 13:27:17 +03:00
parent 2a1b6f55af
commit 4d90180e24
10 changed files with 119 additions and 3 deletions
@@ -0,0 +1,26 @@
contract C {
uint constant a = 2;
uint constant aa = a;
uint constant aaa = aa;
bytes2 constant b = 0xabcd;
bytes2 constant bb = b;
bytes3 constant c = "abc";
bytes3 constant cc = c;
bytes3 constant ccc = cc;
bytes3 constant cccc = ccc;
bool constant d = true;
bool constant dd = d;
address payable constant e = 0x1212121212121212121212121212121212121212;
address payable constant ee = e;
function f() public pure returns (uint w, bytes2 x, bytes3 y, bool z, address t) {
assembly {
w := aaa
x := bb
y := cccc
z := dd
t := ee
}
}
}
// ----
// f() -> 2, left(0xabcd), left(0x616263), true, 0x1212121212121212121212121212121212121212
@@ -7,4 +7,4 @@ contract C {
}
}
// ----
// TypeError: (115-116): Only direct number constants are supported by inline assembly.
// TypeError: (115-116): Only direct number constants and references to such constants are supported by inline assembly.
@@ -0,0 +1,11 @@
contract C {
bytes32 constant x = keccak256("abc");
bytes32 constant y = x;
function f() public pure returns (uint t) {
assembly {
t := y
}
}
}
// ----
// TypeError: (168-169): Only direct number constants and references to such constants are supported by inline assembly.
@@ -8,4 +8,3 @@ contract C {
}
}
// ----
// TypeError: (134-135): Only direct number constants are supported by inline assembly.