Merge pull request #14103 from ethereum/extra-tests

A few extra tests for operators, denominations and virtual functions
This commit is contained in:
Kamil Śliwak 2023-04-12 11:32:26 +02:00 committed by GitHub
commit 46457cfc25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,25 @@
contract C {
uint[2 wei] a;
uint[2 gwei] b;
uint[2 ether] c;
uint[2 seconds] d;
uint[2 minutes] e;
uint[2 hours] f;
uint[2 days] g;
uint[2 weeks] h;
function lengths() public returns (uint, uint, uint, uint, uint, uint, uint, uint) {
return (
a.length,
b.length,
c.length,
d.length,
e.length,
f.length,
g.length,
h.length
);
}
}
// ----
// lengths() -> 2, 2000000000, 2000000000000000000, 2, 120, 7200, 172800, 1209600

View File

@ -0,0 +1,15 @@
contract C {
uint public g = 1.5 gwei;
uint public e = 1.5 ether;
uint public m = 1.5 minutes;
uint public h = 1.5 hours;
uint public d = 1.5 days;
uint public w = 1.5 weeks;
}
// ----
// g() -> 1500000000
// e() -> 1500000000000000000
// m() -> 90
// h() -> 5400
// d() -> 129600
// w() -> 907200

View File

@ -0,0 +1,22 @@
type U8 is uint8;
using {yoloAdd as +, yoloDiv as /} for U8 global;
function yoloAdd(U8 x, U8 y) pure returns (U8 z) {
assembly {
z := add(x, y) // Wrong! No cleanup.
}
}
function yoloDiv(U8 x, U8 y) pure returns (U8 z) {
assembly {
z := div(x, y) // Wrong! No cleanup.
}
}
contract C {
function divAddNoOverflow(U8 a, U8 b, U8 c) external pure returns (U8) {
return a / (b + c);
}
}
// ----
// divAddNoOverflow(uint8,uint8,uint8): 4, 0xff, 3 -> 0

View File

@ -0,0 +1,23 @@
contract A {
function f() internal virtual {
mutableWithViewOverride();
mutableWithPureOverride();
viewWithPureOverride();
}
function mutableWithViewOverride() internal virtual {}
function mutableWithPureOverride() internal virtual {}
function viewWithPureOverride() internal view virtual {}
}
contract C is A {
function run() public {
f();
}
function mutableWithViewOverride() internal view override {}
function mutableWithPureOverride() internal pure override {}
function viewWithPureOverride() internal pure override {}
}
// ----
// run() ->

View File

@ -0,0 +1,23 @@
contract A {
function f() internal virtual {
mutableWithViewOverride();
mutableWithPureOverride();
viewWithPureOverride();
}
function mutableWithViewOverride() public virtual {}
function mutableWithPureOverride() public virtual {}
function viewWithPureOverride() public view virtual {}
}
contract C is A {
function run() public {
f();
}
function mutableWithViewOverride() public view override {}
function mutableWithPureOverride() public pure override {}
function viewWithPureOverride() public pure override {}
}
// ----
// run() ->

View File

@ -0,0 +1,12 @@
contract C {
uint[42 wei] a;
uint[42 gwei] b;
uint[42 ether] c;
uint[42 seconds] d;
uint[42 minutes] e;
uint[42 hours] f;
uint[42 days] g;
uint[42 weeks] h;
}
// ----
// Warning 7325: (58-72): Type uint256[42000000000000000000] covers a large part of storage and thus makes collisions likely. Either use mappings or dynamic arrays and allow their size to be increased only in small quantities per transaction.

View File

@ -0,0 +1,5 @@
contract C {
address a = 0x11111122222333334444455555666667777788888 wei;
}
// ----
// TypeError 5145: (26-73): Hexadecimal numbers cannot be used with unit denominations. You can use an expression of the form "0x1234 * 1 day" instead.

View File

@ -0,0 +1,5 @@
contract C {
bool constant x = true ether;
}
// ----
// ParserError 2314: (37-42): Expected ';' but got 'ether'

View File

@ -0,0 +1,5 @@
contract C {
string s = "abc" ether;
}
// ----
// ParserError 2314: (31-36): Expected ';' but got 'ether'