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