mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
New tests.
This commit is contained in:
parent
e262f47f21
commit
c9ef727136
@ -0,0 +1,13 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public returns (uint y) {
|
||||||
|
unchecked{{
|
||||||
|
uint max = type(uint).max;
|
||||||
|
uint x = max + 1;
|
||||||
|
y = x;
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f() -> 0x00
|
@ -0,0 +1,18 @@
|
|||||||
|
contract C {
|
||||||
|
uint public x = msg.value - 10;
|
||||||
|
constructor() payable {}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract D {
|
||||||
|
function f() public {
|
||||||
|
unchecked {
|
||||||
|
new C();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function g() public payable returns (uint) {
|
||||||
|
return (new C{value: 11}()).x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// f() -> FAILURE
|
||||||
|
// g(), 100 wei -> 1
|
13
test/libsolidity/semanticTests/arithmetics/checked_add.sol
Normal file
13
test/libsolidity/semanticTests/arithmetics/checked_add.sol
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
contract C {
|
||||||
|
// Input is still not checked - this needs ABIEncoderV2!
|
||||||
|
function f(uint16 a, uint16 b) public returns (uint16) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// ABIEncoderV1Only: true
|
||||||
|
// ----
|
||||||
|
// f(uint16,uint16): 65534, 0 -> 0xfffe
|
||||||
|
// f(uint16,uint16): 65536, 0 -> 0x00
|
||||||
|
// f(uint16,uint16): 65535, 0 -> 0xffff
|
||||||
|
// f(uint16,uint16): 65535, 1 -> FAILURE
|
@ -0,0 +1,14 @@
|
|||||||
|
contract C {
|
||||||
|
function add(uint16 a, uint16 b) public returns (uint16) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function f(uint16 a, uint16 b, uint16 c) public returns (uint16) {
|
||||||
|
unchecked { return add(a, b) + c; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f(uint16,uint16,uint16): 0xe000, 0xe500, 2 -> FAILURE
|
||||||
|
// f(uint16,uint16,uint16): 0xe000, 0x1000, 0x1000 -> 0x00
|
@ -0,0 +1,15 @@
|
|||||||
|
contract C {
|
||||||
|
modifier add(uint16 a, uint16 b) {
|
||||||
|
unchecked { a + b; }
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
function f(uint16 a, uint16 b, uint16 c) public add(a, b) returns (uint16) {
|
||||||
|
return b + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f(uint16,uint16,uint16): 0xe000, 0xe500, 2 -> 58626
|
||||||
|
// f(uint16,uint16,uint16): 0x1000, 0xe500, 0xe000 -> FAILURE
|
@ -2,6 +2,14 @@ contract C {
|
|||||||
function f(int a, int b) public pure returns (int) {
|
function f(int a, int b) public pure returns (int) {
|
||||||
return a % b;
|
return a % b;
|
||||||
}
|
}
|
||||||
|
function g(bool _check) public pure returns (int) {
|
||||||
|
int x = type(int).min;
|
||||||
|
if (_check) {
|
||||||
|
return x / -1;
|
||||||
|
} else {
|
||||||
|
unchecked { return x / -1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====
|
// ====
|
||||||
@ -12,3 +20,5 @@ contract C {
|
|||||||
// f(int256,int256): -7, 5 -> -2
|
// f(int256,int256): -7, 5 -> -2
|
||||||
// f(int256,int256): -7, 5 -> -2
|
// f(int256,int256): -7, 5 -> -2
|
||||||
// f(int256,int256): -5, -5 -> 0
|
// f(int256,int256): -5, -5 -> 0
|
||||||
|
// g(bool): true -> FAILURE
|
||||||
|
// g(bool): false -> -57896044618658097711785492504343953926634992332820282019728792003956564819968
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
contract C {
|
||||||
|
function add(uint16 a, uint16 b) public returns (uint16) {
|
||||||
|
unchecked {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function f(uint16 a) public returns (uint16) {
|
||||||
|
return add(a, 0x100) + 0x100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f(uint16): 7 -> 0x0207
|
||||||
|
// f(uint16): 0xffff -> 511
|
||||||
|
// f(uint16): 0xfeff -> FAILURE
|
@ -0,0 +1,22 @@
|
|||||||
|
contract C {
|
||||||
|
function div(uint256 a, uint256 b) public returns (uint256) {
|
||||||
|
// Does not disable div by zero check
|
||||||
|
unchecked {
|
||||||
|
return a / b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mod(uint256 a, uint256 b) public returns (uint256) {
|
||||||
|
// Does not disable div by zero check
|
||||||
|
unchecked {
|
||||||
|
return a % b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// div(uint256,uint256): 7, 2 -> 3
|
||||||
|
// div(uint256,uint256): 7, 0 -> FAILURE # throws #
|
||||||
|
// mod(uint256,uint256): 7, 2 -> 1
|
||||||
|
// mod(uint256,uint256): 7, 0 -> FAILURE # throws #
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
for (unchecked { uint x = 2 }; x < 2; x ++) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError 6933: (57-66): Expected primary expression.
|
@ -0,0 +1,3 @@
|
|||||||
|
function f() pure returns (uint) unchecked {}
|
||||||
|
// ----
|
||||||
|
// ParserError 5296: (33-42): "unchecked" blocks can only be used inside regular blocks.
|
@ -0,0 +1,5 @@
|
|||||||
|
contract C {
|
||||||
|
modifier m() { unchecked { _; } }
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// SyntaxError 2573: (44-45): The placeholder statement "_" cannot be used inside an "unchecked" block.
|
11
test/libsolidity/syntaxTests/unchecked/unchecked_nested.sol
Normal file
11
test/libsolidity/syntaxTests/unchecked/unchecked_nested.sol
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
unchecked {
|
||||||
|
unchecked {
|
||||||
|
uint x = 2 + 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// SyntaxError 1941: (76-133): "unchecked" blocks cannot be nested.
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
for (uint x = 2; x < 2; unchecked { x ++; }) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError 6933: (76-85): Expected primary expression.
|
@ -0,0 +1,8 @@
|
|||||||
|
contract C {
|
||||||
|
uint x = unchecked { f() + 2 }
|
||||||
|
function f() public pure returns (uint) {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError 6933: (26-35): Expected primary expression.
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
while (true) unchecked {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError 5296: (65-74): "unchecked" blocks can only be used inside regular blocks.
|
Loading…
Reference in New Issue
Block a user