Skip to content

Commit 237c1e5

Browse files
committed
Semantic tests for User Defined Value types
1 parent 67f5c82 commit 237c1e5

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
type MyAddress is address;
2+
3+
contract C {
4+
MyAddress[] addresses;
5+
function f(MyAddress[] calldata _addresses) external {
6+
for (uint i = 0; i < _addresses.length; i++) {
7+
address(_addresses[i]).call("test");
8+
}
9+
addresses = _addresses;
10+
}
11+
function g(MyAddress[] memory _addresses) external {
12+
for (uint i = 0; i < _addresses.length; i++) {
13+
address(_addresses[i]).call("test");
14+
}
15+
addresses = _addresses;
16+
}
17+
function test_f() external returns (bool) {
18+
clean();
19+
MyAddress[] memory test = new MyAddress[](3);
20+
test[0] = MyAddress(1);
21+
test[1] = MyAddress(2);
22+
test[2] = MyAddress(3);
23+
this.f(test);
24+
test_equality(test);
25+
return true;
26+
}
27+
function test_g() external returns (bool) {
28+
clean();
29+
MyAddress[] memory test = new MyAddress[](5);
30+
test[0] = MyAddress(1);
31+
test[1] = MyAddress(2);
32+
test[2] = MyAddress(3);
33+
test[3] = MyAddress(4);
34+
test[4] = MyAddress(5);
35+
this.g(test);
36+
test_equality(test);
37+
return true;
38+
}
39+
function clean() internal {
40+
for (uint i = 0 ; i < addresses.length; i++) {
41+
addresses[i] = MyAddress(0);
42+
}
43+
}
44+
function test_equality(MyAddress[] memory _addresses) internal view {
45+
require (_addresses.length == addresses.length);
46+
for (uint i = 0; i < _addresses.length; i++) {
47+
require(address(_addresses[i]) == address(addresses[i]));
48+
}
49+
}
50+
}
51+
// ====
52+
// compileViaYul: also
53+
// ----
54+
// test_f() -> true
55+
// gas legacy: 96989494
56+
// test_g() -> FAILURE
57+
// gas legacy: 98438081
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
type MyAddress is address;
2+
contract C {
3+
function id(MyAddress a) external returns (MyAddress b) {
4+
b = a;
5+
}
6+
function unwrap(MyAddress a) external returns (address b) {
7+
b = address(a);
8+
}
9+
function wrap(address a) external returns (MyAddress b) {
10+
b = MyAddress(a);
11+
}
12+
}
13+
// ====
14+
// compileViaYul: also
15+
// ----
16+
// id(address): 5 -> 5
17+
// id(address): 0xffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
18+
// id(address): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> FAILURE
19+
// unwrap(address): 5 -> 5
20+
// unwrap(address): 0xffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
21+
// unwrap(address): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> FAILURE
22+
// wrap(address): 5 -> 5
23+
// wrap(address): 0xffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
24+
// wrap(address): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> FAILURE
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
type MyInt is int;
2+
contract C {
3+
function f() external returns (MyInt a) {
4+
}
5+
function g() external returns (MyInt b) {
6+
b = MyInt(int(1));
7+
}
8+
}
9+
// ====
10+
// compileViaYul: also
11+
// ----
12+
// f() -> 0
13+
// g() -> 1

0 commit comments

Comments
 (0)