mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Extract 45 tests from SolidityEndToEndTest.cpp
This commit is contained in:
		
							parent
							
								
									a74a2df513
								
							
						
					
					
						commit
						67e9776418
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(bytes calldata data) | ||||||
|  |         external | ||||||
|  |         pure | ||||||
|  |         returns (uint256, bytes memory r) | ||||||
|  |     { | ||||||
|  |         return abi.decode(data, (uint256, bytes)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(bytes memory data) public pure returns (uint256, bytes memory) { | ||||||
|  |         return abi.decode(data, (uint256, bytes)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" | ||||||
| @ -0,0 +1,10 @@ | |||||||
|  | contract C { | ||||||
|  |     bytes data; | ||||||
|  | 
 | ||||||
|  |     function f(bytes memory _data) public returns (uint256, bytes memory) { | ||||||
|  |         data = _data; | ||||||
|  |         return abi.decode(data, (uint256, bytes)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" | ||||||
| @ -0,0 +1,11 @@ | |||||||
|  | // Tests that this will not end up using a "bytes0" type | ||||||
|  | // (which would assert) | ||||||
|  | contract C { | ||||||
|  |     function f() public pure returns (bytes memory, bytes memory) { | ||||||
|  |         return (abi.encode(""), abi.encodePacked("")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x40, 0xc0, 0x60, 0x20, 0x0, 0x0, 0x0 | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | contract Test { | ||||||
|  |     uint24[3][] public data; | ||||||
|  | 
 | ||||||
|  |     function set(uint24[3][] memory _data) public returns (uint256) { | ||||||
|  |         data = _data; | ||||||
|  |         return data.length; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get() public returns (uint24[3][] memory) { | ||||||
|  |         return data; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // set(uint24[3][]): 0x20, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 -> 0x06 | ||||||
|  | // data(uint256,uint256): 0x02, 0x02 -> 0x09 | ||||||
|  | // data(uint256,uint256): 0x05, 0x01 -> 0x11 | ||||||
|  | // data(uint256,uint256): 0x06, 0x00 -> FAILURE | ||||||
|  | // get() -> 0x20, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract Test { | ||||||
|  |     function set(uint24[3][] memory _data, uint256 a, uint256 b) | ||||||
|  |         public | ||||||
|  |         returns (uint256 l, uint256 e) | ||||||
|  |     { | ||||||
|  |         l = _data.length; | ||||||
|  |         e = _data[a][b]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // set(uint24[3][],uint256,uint256): 0x60, 0x03, 0x02, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 -> 0x06, 0x0c | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | contract C { | ||||||
|  |     bytes32 constant x = keccak256("abc"); | ||||||
|  | 
 | ||||||
|  |     function f() public returns (bytes32) { | ||||||
|  |         return x; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | contract C { | ||||||
|  |     function shl(uint256 a, uint256 b) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(b, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr(uint256 a, uint256 b) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(b, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function sar(uint256 a, uint256 b) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := sar(b, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: >=constantinople | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // shl(uint256,uint256): 0x01, 0x02 -> 0x04 | ||||||
|  | // shl(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x01 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // shl(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x100 -> 0x00 | ||||||
|  | // shr(uint256,uint256): 0x03, 0x01 -> 0x01 | ||||||
|  | // shr(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x01 -> 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // shr(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0xff -> 0x01 | ||||||
|  | // shr(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x100 -> 0x00 | ||||||
|  | // sar(uint256,uint256): 0x03, 0x01 -> 0x01 | ||||||
|  | // sar(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x01 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // sar(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0xff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // sar(uint256,uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0x100 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,122 @@ | |||||||
|  | contract C { | ||||||
|  |     function shl_zero(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(0, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_zero(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(0, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function sar_zero(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := sar(0, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(0x110, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(0x110, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function sar_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := sar(0x110, a) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_combined(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(4, shl(12, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_combined(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(4, shr(12, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function sar_combined(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := sar(4, sar(12, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_combined_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(0xd0, shl(0x40, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_combined_overflow(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shl(0x01, shl(not(0x00), a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_combined_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(0xd0, shr(0x40, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_combined_overflow(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := shr(0x01, shr(not(0x00), a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function sar_combined_large(uint256 a) public returns (uint256 c) { | ||||||
|  |         assembly { | ||||||
|  |             c := sar(0xd0, sar(0x40, a)) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: >=constantinople | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // shl_zero(uint256): 0x00 -> 0x00 | ||||||
|  | // shl_zero(uint256): 0xffff -> 0xffff | ||||||
|  | // shl_zero(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // shr_zero(uint256): 0x00 -> 0x00 | ||||||
|  | // shr_zero(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // sar_zero(uint256): 0x00 -> 0x00 | ||||||
|  | // sar_zero(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // shl_large(uint256): 0x00 -> 0x00 | ||||||
|  | // shl_large(uint256): 0xffff -> 0x00 | ||||||
|  | // shl_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // shr_large(uint256): 0x00 -> 0x00 | ||||||
|  | // shr_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // sar_large(uint256): 0x00 -> 0x00 | ||||||
|  | // sar_large(uint256): 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // sar_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // shl_combined(uint256): 0x00 -> 0x00 | ||||||
|  | // shl_combined(uint256): 0xffff -> 0xffff0000 | ||||||
|  | // shl_combined(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 | ||||||
|  | // shr_combined(uint256): 0x00 -> 0x00 | ||||||
|  | // shr_combined(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // sar_combined(uint256): 0x00 -> 0x00 | ||||||
|  | // sar_combined(uint256): 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // sar_combined(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // shl_combined_large(uint256): 0x00 -> 0x00 | ||||||
|  | // shl_combined_large(uint256): 0xffff -> 0x00 | ||||||
|  | // shl_combined_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // shl_combined_overflow(uint256): 0x02 -> 0x00 | ||||||
|  | // shr_combined_large(uint256): 0x00 -> 0x00 | ||||||
|  | // shr_combined_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // shr_combined_overflow(uint256): 0x02 -> 0x00 | ||||||
|  | // sar_combined_large(uint256): 0x00 -> 0x00 | ||||||
|  | // sar_combined_large(uint256): 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0x00 | ||||||
|  | // sar_combined_large(uint256): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,83 @@ | |||||||
|  | contract C { | ||||||
|  |     function shl_1() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shl(2, 1) | ||||||
|  |         } | ||||||
|  |         assert(c == 4); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_2() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shl( | ||||||
|  |                 1, | ||||||
|  |                 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |         assert( | ||||||
|  |             c == | ||||||
|  |                 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  |         ); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shl_3() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shl( | ||||||
|  |                 256, | ||||||
|  |                 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |         assert(c == 0); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_1() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shr(1, 3) | ||||||
|  |         } | ||||||
|  |         assert(c == 1); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_2() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shr( | ||||||
|  |                 1, | ||||||
|  |                 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |         assert( | ||||||
|  |             c == | ||||||
|  |                 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  |         ); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function shr_3() public returns (bool) { | ||||||
|  |         uint256 c; | ||||||
|  |         assembly { | ||||||
|  |             c := shr( | ||||||
|  |                 256, | ||||||
|  |                 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |         assert(c == 0); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: >=constantinople | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // shl_1() -> 0x01 | ||||||
|  | // shl_2() -> 0x01 | ||||||
|  | // shl_3() -> 0x01 | ||||||
|  | // shr_1() -> 0x01 | ||||||
|  | // shr_2() -> 0x01 | ||||||
|  | // shr_3() -> 0x01 | ||||||
							
								
								
									
										23
									
								
								test/libsolidity/semanticTests/extracted/bool_conversion.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								test/libsolidity/semanticTests/extracted/bool_conversion.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(bool _b) public returns (uint256) { | ||||||
|  |         if (_b) return 1; | ||||||
|  |         else return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(bool _in) public returns (bool _out) { | ||||||
|  |         _out = _in; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(bool): 0x0 -> 0x0 | ||||||
|  | // f(bool): 0x1 -> 0x1 | ||||||
|  | // f(bool): 0x2 -> 0x1 | ||||||
|  | // f(bool): 0x3 -> 0x1 | ||||||
|  | // f(bool): 0xff -> 0x1 | ||||||
|  | // g(bool): 0x0 -> 0x0 | ||||||
|  | // g(bool): 0x1 -> 0x1 | ||||||
|  | // g(bool): 0x2 -> 0x1 | ||||||
|  | // g(bool): 0x3 -> 0x1 | ||||||
|  | // g(bool): 0xff -> 0x1 | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(bool _b) public returns (uint256) { | ||||||
|  |         if (_b) return 1; | ||||||
|  |         else return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(bool _in) public returns (bool _out) { | ||||||
|  |         _out = _in; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bool): 0x0 -> 0x0 | ||||||
|  | // f(bool): 0x1 -> 0x1 | ||||||
|  | // f(bool): 0x2 -> FAILURE | ||||||
|  | // f(bool): 0x3 -> FAILURE | ||||||
|  | // f(bool): 0xff -> FAILURE | ||||||
|  | // g(bool): 0x0 -> 0x0 | ||||||
|  | // g(bool): 0x1 -> 0x1 | ||||||
|  | // g(bool): 0x2 -> FAILURE | ||||||
|  | // g(bool): 0x3 -> FAILURE | ||||||
|  | // g(bool): 0xff -> FAILURE | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract Test { | ||||||
|  |     function set(bytes memory _data, uint256 i) | ||||||
|  |         public | ||||||
|  |         returns (uint256 l, bytes1 c) | ||||||
|  |     { | ||||||
|  |         l = _data.length; | ||||||
|  |         c = _data[i]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // set(bytes,uint256): 0x40, 0x03, 0x08, "abcdefgh" -> 0x08, "d" | ||||||
| @ -0,0 +1,74 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f1(bytes[1] calldata a) | ||||||
|  |         external | ||||||
|  |         returns (uint256, uint256, uint256, uint256) | ||||||
|  |     { | ||||||
|  |         return (a[0].length, uint8(a[0][0]), uint8(a[0][1]), uint8(a[0][2])); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f2(bytes[1] calldata a, bytes[1] calldata b) | ||||||
|  |         external | ||||||
|  |         returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) | ||||||
|  |     { | ||||||
|  |         return ( | ||||||
|  |             a[0].length, | ||||||
|  |             uint8(a[0][0]), | ||||||
|  |             uint8(a[0][1]), | ||||||
|  |             uint8(a[0][2]), | ||||||
|  |             b[0].length, | ||||||
|  |             uint8(b[0][0]), | ||||||
|  |             uint8(b[0][1]) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g1(bytes[2] calldata a) | ||||||
|  |         external | ||||||
|  |         returns ( | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256, | ||||||
|  |             uint256 | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         return ( | ||||||
|  |             a[0].length, | ||||||
|  |             uint8(a[0][0]), | ||||||
|  |             uint8(a[0][1]), | ||||||
|  |             uint8(a[0][2]), | ||||||
|  |             a[1].length, | ||||||
|  |             uint8(a[1][0]), | ||||||
|  |             uint8(a[1][1]), | ||||||
|  |             uint8(a[1][2]) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g2(bytes[] calldata a) external returns (uint256[8] memory) { | ||||||
|  |         return [ | ||||||
|  |             a.length, | ||||||
|  |             a[0].length, | ||||||
|  |             uint8(a[0][0]), | ||||||
|  |             uint8(a[0][1]), | ||||||
|  |             a[1].length, | ||||||
|  |             uint8(a[1][0]), | ||||||
|  |             uint8(a[1][1]), | ||||||
|  |             uint8(a[1][2]) | ||||||
|  |         ]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // found expectation comments: | ||||||
|  | // same offset for both arrays @ ABI_CHECK( | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // f1(bytes[1]): 0x20, 0x20, 0x3, hex"0102030000000000000000000000000000000000000000000000000000000000" -> 0x3, 0x1, 0x2, 0x3 | ||||||
|  | // f2(bytes[1],bytes[1]): 0x40, 0xa0, 0x20, 0x3, hex"0102030000000000000000000000000000000000000000000000000000000000", 0x20, 0x2, hex"0102000000000000000000000000000000000000000000000000000000000000" -> 0x3, 0x1, 0x2, 0x3, 0x2, 0x1, 0x2 | ||||||
|  | // g1(bytes[2]): 0x20, 0x40, 0x80, 0x3, hex"0102030000000000000000000000000000000000000000000000000000000000", 0x3, hex"0405060000000000000000000000000000000000000000000000000000000000" -> 0x3, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6 | ||||||
|  | // g1(bytes[2]): 0x20, 0x40, 0x40, 0x3, hex"0102030000000000000000000000000000000000000000000000000000000000" -> 0x3, 0x1, 0x2, 0x3, 0x3, 0x1, 0x2, 0x3 | ||||||
|  | // g2(bytes[]): 0x20, 0x2, 0x40, 0x80, 0x2, hex"0102000000000000000000000000000000000000000000000000000000000000", 0x3, hex"0405060000000000000000000000000000000000000000000000000000000000" -> 0x2, 0x2, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(bytes[] calldata a) | ||||||
|  |         external | ||||||
|  |         returns (uint256, uint256, bytes memory) | ||||||
|  |     { | ||||||
|  |         bytes memory m = a[0]; | ||||||
|  |         return (a.length, m.length, m); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes[]): 0x20, 0x1, 0x20, 0x2, hex"6162000000000000000000000000000000000000000000000000000000000000" -> 0x1, 0x2, 0x60, 0x2, hex"6162000000000000000000000000000000000000000000000000000000000000" | ||||||
|  | // f(bytes[]): 0x20, 0x1, 0x20, 0x20, hex"7878787878787878787878787878787878787878787878787878787878787878" -> 0x1, 0x20, 0x60, 0x20, hex"7878787878787878787878787878787878787878787878787878787878787878" | ||||||
|  | // f(bytes[]): 0x20, 0x1, 0x20, 0x20, hex"7800000000000000000000000000000000000000000000000000000000000061" -> 0x1, 0x20, 0x60, 0x20, hex"7800000000000000000000000000000000000000000000000000000000000061" | ||||||
|  | // f(bytes[]): 0x20, 0x1, 0x20, 0x20, hex"6100000000000000000000000000000000000000000000000000000000000078" -> 0x1, 0x20, 0x60, 0x20, hex"6100000000000000000000000000000000000000000000000000000000000078" | ||||||
|  | // f(bytes[]): 0x20, 0x1, 0x20, 0x20, hex"616d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d78" -> 0x1, 0x20, 0x60, 0x20, hex"616d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d78" | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(string[] calldata a) | ||||||
|  |         external | ||||||
|  |         returns (uint256, uint256, uint256, string memory) | ||||||
|  |     { | ||||||
|  |         string memory s1 = a[0]; | ||||||
|  |         bytes memory m1 = bytes(s1); | ||||||
|  |         return (a.length, m1.length, uint8(m1[0]), s1); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(string[]): 0x20, 0x1, 0x20, 0x2, hex"6162000000000000000000000000000000000000000000000000000000000000" -> 1, 2, 97, 0x80, 2, "ab" | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8 a; | ||||||
|  |         bytes1 b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f(S calldata s) external pure returns (uint256 a, bytes32 b) { | ||||||
|  |         uint8 tmp1 = s.a; | ||||||
|  |         bytes1 tmp2 = s.b; | ||||||
|  |         assembly { | ||||||
|  |             a := tmp1 | ||||||
|  |             b := tmp2 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f((uint8,bytes1)): 0x12, hex"3400000000000000000000000000000000000000000000000000000000000000" -> 0x12, hex"3400000000000000000000000000000000000000000000000000000000000000" # double check that the valid case goes through # | ||||||
|  | // f((uint8,bytes1)): 0x1234, hex"5678000000000000000000000000000000000000000000000000000000000000" -> FAILURE | ||||||
|  | // f((uint8,bytes1)): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -> FAILURE | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | // Checks that address types are properly cleaned before they are compared. | ||||||
|  | contract C { | ||||||
|  |     function f(address a) public returns (uint256) { | ||||||
|  |         if (a != 0x1234567890123456789012345678901234567890) return 1; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(address payable a) public returns (uint256) { | ||||||
|  |         if (a != 0x1234567890123456789012345678901234567890) return 1; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(address): 0xffff1234567890123456789012345678901234567890 -> 0x0 # We input longer data on purpose.# | ||||||
|  | // g(address): 0xffff1234567890123456789012345678901234567890 -> 0x0 | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // Checks that address types are properly cleaned before they are compared. | ||||||
|  | contract C { | ||||||
|  |     function f(address a) public returns (uint256) { | ||||||
|  |         if (a != 0x1234567890123456789012345678901234567890) return 1; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(address payable a) public returns (uint256) { | ||||||
|  |         if (a != 0x1234567890123456789012345678901234567890) return 1; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(address): 0xffff1234567890123456789012345678901234567890 -> FAILURE # We input longer data on purpose.# | ||||||
|  | // g(address): 0xffff1234567890123456789012345678901234567890 -> FAILURE | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | // Checks that bytesXX types are properly cleaned before they are compared. | ||||||
|  | contract C { | ||||||
|  |     function f(bytes2 a, uint16 x) public returns (uint256) { | ||||||
|  |         if (a != "ab") return 1; | ||||||
|  |         if (x != 0x0102) return 2; | ||||||
|  |         if (bytes3(uint24(x)) != 0x000102) return 3; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(bytes2,uint16): "abc", 0x40102 -> 0x0 # We input longer data on purpose. # | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // Checks that bytesXX types are properly cleaned before they are compared. | ||||||
|  | contract C { | ||||||
|  |     function f(bytes2 a, uint16 x) public returns (uint256) { | ||||||
|  |         if (a != "ab") return 1; | ||||||
|  |         if (x != 0x0102) return 2; | ||||||
|  |         if (bytes3(uint24(x)) != 0x000102) return 3; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes2,uint16): "abc", 0x40102 -> FAILURE # We input longer data on purpose. # | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | contract C { | ||||||
|  |     uint256 value; | ||||||
|  | 
 | ||||||
|  |     function set(uint256 _value) external { | ||||||
|  |         value = _value; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get() external view returns (uint256) { | ||||||
|  |         return value; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get_delegated() external returns (bool, bytes memory) { | ||||||
|  |         return address(this).delegatecall(abi.encodeWithSignature("get()")); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function assert0() external view { | ||||||
|  |         assert(value == 0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function assert0_delegated() external returns (bool, bytes memory) { | ||||||
|  |         return address(this).delegatecall(abi.encodeWithSignature("assert0()")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: >=byzantium | ||||||
|  | // ---- | ||||||
|  | // get() -> 0x00 | ||||||
|  | // assert0_delegated() -> 0x01, 0x40, 0x0 | ||||||
|  | // get_delegated() -> 0x01, 0x40, 0x20, 0x0 | ||||||
|  | // set(uint256): 0x01 -> | ||||||
|  | // get() -> 0x01 | ||||||
|  | // assert0_delegated() -> 0x00, 0x40, 0x0 | ||||||
|  | // get_delegated() -> 0x01, 0x40, 0x20, 0x1 | ||||||
|  | // set(uint256): 0x2a -> | ||||||
|  | // get() -> 0x2a | ||||||
|  | // assert0_delegated() -> 0x00, 0x40, 0x0 | ||||||
|  | // get_delegated() -> 0x01, 0x40, 0x20, 0x2a | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | contract C { | ||||||
|  |     uint256 value; | ||||||
|  | 
 | ||||||
|  |     function set(uint256 _value) external { | ||||||
|  |         value = _value; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get() external view returns (uint256) { | ||||||
|  |         return value; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get_delegated() external returns (bool) { | ||||||
|  |         (bool success,) = address(this).delegatecall(abi.encodeWithSignature("get()")); | ||||||
|  |         return success; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function assert0() external view { | ||||||
|  |         assert(value == 0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function assert0_delegated() external returns (bool) { | ||||||
|  |         (bool success,) = address(this).delegatecall(abi.encodeWithSignature("assert0()")); | ||||||
|  |         return success; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: <byzantium | ||||||
|  | // ---- | ||||||
|  | // get() -> 0x00 | ||||||
|  | // assert0_delegated() -> true | ||||||
|  | // get_delegated() -> true | ||||||
|  | // set(uint256): 0x01 -> | ||||||
|  | // get() -> 0x01 | ||||||
|  | // assert0_delegated() -> false | ||||||
|  | // get_delegated() -> true | ||||||
|  | // set(uint256): 0x2a -> | ||||||
|  | // get() -> 0x2a | ||||||
|  | // assert0_delegated() -> false | ||||||
|  | // get_delegated() -> true | ||||||
| @ -0,0 +1,45 @@ | |||||||
|  | contract c { | ||||||
|  |     struct Data { | ||||||
|  |         uint256 x; | ||||||
|  |         uint256 y; | ||||||
|  |     } | ||||||
|  |     Data[2**10] data; | ||||||
|  |     uint256[2**10 + 3] ids; | ||||||
|  | 
 | ||||||
|  |     function setIDStatic(uint256 id) public { | ||||||
|  |         ids[2] = id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function setID(uint256 index, uint256 id) public { | ||||||
|  |         ids[index] = id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function setData(uint256 index, uint256 x, uint256 y) public { | ||||||
|  |         data[index].x = x; | ||||||
|  |         data[index].y = y; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getID(uint256 index) public returns (uint256) { | ||||||
|  |         return ids[index]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getData(uint256 index) public returns (uint256 x, uint256 y) { | ||||||
|  |         x = data[index].x; | ||||||
|  |         y = data[index].y; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getLengths() public returns (uint256 l1, uint256 l2) { | ||||||
|  |         l1 = data.length; | ||||||
|  |         l2 = ids.length; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // setIDStatic(uint256): 0xb -> | ||||||
|  | // getID(uint256): 0x2 -> 0xb | ||||||
|  | // setID(uint256,uint256): 0x7, 0x8 -> | ||||||
|  | // getID(uint256): 0x7 -> 0x8 | ||||||
|  | // setData(uint256,uint256,uint256): 0x7, 0x8, 0x9 -> | ||||||
|  | // setData(uint256,uint256,uint256): 0x8, 0xa, 0xb -> | ||||||
|  | // getData(uint256): 0x7 -> 0x8, 0x9 | ||||||
|  | // getData(uint256): 0x8 -> 0xa, 0xb | ||||||
|  | // getLengths() -> 0x400, 0x403 | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | contract C { | ||||||
|  |     bytes16[] public data; | ||||||
|  | 
 | ||||||
|  |     function f(bytes32 x) public returns (bytes1) { | ||||||
|  |         return x[2]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(bytes32 x) public returns (uint256) { | ||||||
|  |         data = [x[0], x[1], x[2]]; | ||||||
|  |         data[0] = "12345"; | ||||||
|  |         return uint256(uint8(data[0][4])); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(bytes32): "789" -> "9" | ||||||
|  | // g(bytes32): "789" -> 0x35 | ||||||
|  | // data(uint256): 0x01 -> "8" | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | contract C { | ||||||
|  |     uint256 public x; | ||||||
|  | 
 | ||||||
|  |     function f() public pure returns (bytes4) { | ||||||
|  |         return this.f.selector; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g() public returns (bytes4) { | ||||||
|  |         function () pure external returns (bytes4) fun = this.f; | ||||||
|  |         return fun.selector; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function h() public returns (bytes4) { | ||||||
|  |         function () pure external returns (bytes4) fun = this.f; | ||||||
|  |         return fun.selector; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function i() public pure returns (bytes4) { | ||||||
|  |         return this.x.selector; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 | ||||||
|  | // g() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 | ||||||
|  | // h() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 | ||||||
|  | // i() -> 0x0c55699c00000000000000000000000000000000000000000000000000000000 | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | contract c { | ||||||
|  |     bytes data; | ||||||
|  | 
 | ||||||
|  |     function foo() public returns (bytes32) { | ||||||
|  |         data.push("x"); | ||||||
|  |         data.push("y"); | ||||||
|  |         data.push("z"); | ||||||
|  |         return keccak256(abi.encodePacked("b", keccak256(data), "a")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // foo() -> 0xb338eefce206f9f57b83aa738deecd5326dc4b72dd81ee6a7c621a6facb7acdc | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | contract c { | ||||||
|  |     function foo(uint256 a, uint256 b, uint256 c) public returns (bytes32 d) { | ||||||
|  |         d = keccak256(abi.encodePacked(a, b, c)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // foo(uint256,uint256,uint256): 0xa, 0xc, 0xd -> 0xbc740a98aae5923e8f04c9aa798c9ee82f69e319997699f2782c40828db9fd81 | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | contract c { | ||||||
|  |     function foo(uint256 a, uint16 b) public returns (bytes32 d) { | ||||||
|  |         d = keccak256(abi.encodePacked(a, b, uint8(145))); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // foo(uint256,uint16): 0xa, 0xc -> 0x88acd45f75907e7c560318bc1a5249850a0999c4896717b1167d05d116e6dbad | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | contract c { | ||||||
|  |     function foo() public returns (bytes32 d) { | ||||||
|  |         d = keccak256("foo"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function bar(uint256 a, uint16 b) public returns (bytes32 d) { | ||||||
|  |         d = keccak256(abi.encodePacked(a, b, uint8(145), "foo")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // foo() -> 0x41b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d | ||||||
|  | // bar(uint256,uint16): 0xa, 0xc -> 0x6990f36476dc412b1c4baa48e2d9f4aa4bb313f61fda367c8fdbbb2232dc6146 | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | contract Test { | ||||||
|  |     uint24[3][][4] data; | ||||||
|  | 
 | ||||||
|  |     function set(uint24[3][][4] memory x) | ||||||
|  |         internal | ||||||
|  |         returns (uint24[3][][4] memory) | ||||||
|  |     { | ||||||
|  |         x[1][2][2] = 1; | ||||||
|  |         x[1][3][2] = 7; | ||||||
|  |         return x; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f() public returns (uint24[3][] memory) { | ||||||
|  |         while (data[1].length < 4) data[1].push(); | ||||||
|  |         return set(data)[1]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07 | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | contract Test { | ||||||
|  |     function set(uint24[3][4] memory x) public { | ||||||
|  |         x[2][2] = 1; | ||||||
|  |         x[3][2] = 7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f() public returns (uint24[3][4] memory) { | ||||||
|  |         uint24[3][4] memory data; | ||||||
|  |         set(data); | ||||||
|  |         return data; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07 | ||||||
| @ -0,0 +1,69 @@ | |||||||
|  | contract Test { | ||||||
|  |     struct S { | ||||||
|  |         uint8 x; | ||||||
|  |         uint16 y; | ||||||
|  |         uint256 z; | ||||||
|  |     } | ||||||
|  |     struct X { | ||||||
|  |         uint8 x; | ||||||
|  |         S s; | ||||||
|  |         uint8[2] a; | ||||||
|  |     } | ||||||
|  |     X m_x; | ||||||
|  | 
 | ||||||
|  |     function load() | ||||||
|  |         public | ||||||
|  |         returns ( | ||||||
|  |             uint256 a, | ||||||
|  |             uint256 x, | ||||||
|  |             uint256 y, | ||||||
|  |             uint256 z, | ||||||
|  |             uint256 a1, | ||||||
|  |             uint256 a2 | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         m_x.x = 1; | ||||||
|  |         m_x.s.x = 2; | ||||||
|  |         m_x.s.y = 3; | ||||||
|  |         m_x.s.z = 4; | ||||||
|  |         m_x.a[0] = 5; | ||||||
|  |         m_x.a[1] = 6; | ||||||
|  |         X memory d = m_x; | ||||||
|  |         a = d.x; | ||||||
|  |         x = d.s.x; | ||||||
|  |         y = d.s.y; | ||||||
|  |         z = d.s.z; | ||||||
|  |         a1 = d.a[0]; | ||||||
|  |         a2 = d.a[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function store() | ||||||
|  |         public | ||||||
|  |         returns ( | ||||||
|  |             uint256 a, | ||||||
|  |             uint256 x, | ||||||
|  |             uint256 y, | ||||||
|  |             uint256 z, | ||||||
|  |             uint256 a1, | ||||||
|  |             uint256 a2 | ||||||
|  |         ) | ||||||
|  |     { | ||||||
|  |         X memory d; | ||||||
|  |         d.x = 1; | ||||||
|  |         d.s.x = 2; | ||||||
|  |         d.s.y = 3; | ||||||
|  |         d.s.z = 4; | ||||||
|  |         d.a[0] = 5; | ||||||
|  |         d.a[1] = 6; | ||||||
|  |         m_x = d; | ||||||
|  |         a = m_x.x; | ||||||
|  |         x = m_x.s.x; | ||||||
|  |         y = m_x.s.y; | ||||||
|  |         z = m_x.s.z; | ||||||
|  |         a1 = m_x.a[0]; | ||||||
|  |         a2 = m_x.a[1]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // load() -> 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 | ||||||
|  | // store() -> 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 | ||||||
							
								
								
									
										9
									
								
								test/libsolidity/semanticTests/extracted/msg_sig.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								test/libsolidity/semanticTests/extracted/msg_sig.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | contract test { | ||||||
|  |     function foo(uint256 a) public returns (bytes4 value) { | ||||||
|  |         return msg.sig; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // foo(uint256): 0x0 -> 0x2fbebd3800000000000000000000000000000000000000000000000000000000 | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract test { | ||||||
|  |     function boo() public returns (bytes4 value) { | ||||||
|  |         return msg.sig; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function foo(uint256 a) public returns (bytes4 value) { | ||||||
|  |         return boo(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: also | ||||||
|  | // ---- | ||||||
|  | // foo(uint256): 0x0 -> 0x2fbebd3800000000000000000000000000000000000000000000000000000000 | ||||||
							
								
								
									
										23
									
								
								test/libsolidity/semanticTests/extracted/multi_modifiers.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								test/libsolidity/semanticTests/extracted/multi_modifiers.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | // This triggered a bug in some version because the variable in the modifier was not | ||||||
|  | // unregistered correctly. | ||||||
|  | contract C { | ||||||
|  |     uint256 public x; | ||||||
|  |     modifier m1 { | ||||||
|  |         address a1 = msg.sender; | ||||||
|  |         x++; | ||||||
|  |         _; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f1() public m1() { | ||||||
|  |         x += 7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f2() public m1() { | ||||||
|  |         x += 3; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f1() -> | ||||||
|  | // x() -> 0x08 | ||||||
|  | // f2() -> | ||||||
|  | // x() -> 0x0c | ||||||
							
								
								
									
										26
									
								
								test/libsolidity/semanticTests/extracted/reusing_memory.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								test/libsolidity/semanticTests/extracted/reusing_memory.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | // Invoke some features that use memory and test that they do not interfere with each other. | ||||||
|  | contract Helper { | ||||||
|  |     uint256 public flag; | ||||||
|  | 
 | ||||||
|  |     constructor(uint256 x) public { | ||||||
|  |         flag = x; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract Main { | ||||||
|  |     mapping(uint256 => uint256) map; | ||||||
|  | 
 | ||||||
|  |     function f(uint256 x) public returns (uint256) { | ||||||
|  |         map[x] = x; | ||||||
|  |         return | ||||||
|  |             (new Helper(uint256(keccak256(abi.encodePacked(this.g(map[x])))))) | ||||||
|  |                 .flag(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(uint256 a) public returns (uint256) { | ||||||
|  |         return map[a]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(uint256): 0x34 -> 0x46bddb1178e94d7f2892ff5f366840eb658911794f2c3a44c450aa2c505186c1 | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(uint8 a, uint8 b) public returns (uint256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xffffffff | ||||||
|  |         } | ||||||
|  |         // Higher bits should be cleared before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(uint8,uint8): 0x00, 0x04 -> 0x0f | ||||||
|  | // f(uint8,uint8): 0x00, 0x1004 -> 0x0f | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(int8 a, uint8 b) public returns (int256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xfffffff0 | ||||||
|  |         } | ||||||
|  |         // Higher bits should be signextended before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(int8 a, uint8 b) public returns (int256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xf0 | ||||||
|  |         } | ||||||
|  |         // Higher bits should be signextended before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(int8,uint8): 0x00, 0x03 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // f(int8,uint8): 0x00, 0x04 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // f(int8,uint8): 0x00, 0xff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // f(int8,uint8): 0x00, 0x1003 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // f(int8,uint8): 0x00, 0x1004 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // g(int8,uint8): 0x00, 0x03 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // g(int8,uint8): 0x00, 0x04 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // g(int8,uint8): 0x00, 0xff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // g(int8,uint8): 0x00, 0x1003 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // g(int8,uint8): 0x00, 0x1004 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(int8 a, uint8 b) public returns (int256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xfffffff0 | ||||||
|  |         } | ||||||
|  |         // Higher bits should be signextended before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g(int8 a, uint8 b) public returns (int256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xf0 | ||||||
|  |         } | ||||||
|  |         // Higher bits should be signextended before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(int8,uint8): 0x00, 0x03 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // f(int8,uint8): 0x00, 0x04 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // f(int8,uint8): 0x00, 0xff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // f(int8,uint8): 0x00, 0x1003 -> FAILURE | ||||||
|  | // f(int8,uint8): 0x00, 0x1004 -> FAILURE | ||||||
|  | // g(int8,uint8): 0x00, 0x03 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe | ||||||
|  | // g(int8,uint8): 0x00, 0x04 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // g(int8,uint8): 0x00, 0xff -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
|  | // g(int8,uint8): 0x00, 0x1003 -> FAILURE | ||||||
|  | // g(int8,uint8): 0x00, 0x1004 -> FAILURE | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(uint8 a, uint8 b) public returns (uint256) { | ||||||
|  |         assembly { | ||||||
|  |             a := 0xffffffff | ||||||
|  |         } | ||||||
|  |         // Higher bits should be cleared before the shift | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(uint8,uint8): 0x00, 0x04 -> 0x0f | ||||||
|  | // f(uint8,uint8): 0x00, 0x1004 -> FAILURE | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(int16 a, int16 b) public returns (int16) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(int16,int16): 0xff99, 0x00 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99 | ||||||
|  | // f(int16,int16): 0xff99, 0x01 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc | ||||||
|  | // f(int16,int16): 0xff99, 0x02 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6 | ||||||
|  | // f(int16,int16): 0xff99, 0x04 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9 | ||||||
|  | // f(int16,int16): 0xff99, 0x08 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(int16 a, int16 b) public returns (int16) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(int16,int16): 0xff99, 0x00 -> FAILURE | ||||||
|  | // f(int16,int16): 0xff99, 0x01 -> FAILURE | ||||||
|  | // f(int16,int16): 0xff99, 0x02 -> FAILURE | ||||||
|  | // f(int16,int16): 0xff99, 0x04 -> FAILURE | ||||||
|  | // f(int16,int16): 0xff99, 0x08 -> FAILURE | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(int32 a, int32 b) public returns (int32) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(int32,int32): 0xffffff99, 0x00 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99 | ||||||
|  | // f(int32,int32): 0xffffff99, 0x01 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc | ||||||
|  | // f(int32,int32): 0xffffff99, 0x02 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6 | ||||||
|  | // f(int32,int32): 0xffffff99, 0x04 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9 | ||||||
|  | // f(int32,int32): 0xffffff99, 0x08 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(int32 a, int32 b) public returns (int32) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(int32,int32): 0xffffff99, 0x00 -> FAILURE | ||||||
|  | // f(int32,int32): 0xffffff99, 0x01 -> FAILURE | ||||||
|  | // f(int32,int32): 0xffffff99, 0x02 -> FAILURE | ||||||
|  | // f(int32,int32): 0xffffff99, 0x04 -> FAILURE | ||||||
|  | // f(int32,int32): 0xffffff99, 0x08 -> FAILURE | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(int8 a, int8 b) public returns (int8) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // ABIEncoderV1Only: true | ||||||
|  | // ---- | ||||||
|  | // f(int8,int8): 0x99, 0x00 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99 | ||||||
|  | // f(int8,int8): 0x99, 0x01 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc | ||||||
|  | // f(int8,int8): 0x99, 0x02 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6 | ||||||
|  | // f(int8,int8): 0x99, 0x04 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9 | ||||||
|  | // f(int8,int8): 0x99, 0x08 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function f(int8 a, int8 b) public returns (int8) { | ||||||
|  |         return a >> b; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(int8,int8): 0x99, 0x00 -> FAILURE | ||||||
|  | // f(int8,int8): 0x99, 0x01 -> FAILURE | ||||||
|  | // f(int8,int8): 0x99, 0x02 -> FAILURE | ||||||
|  | // f(int8,int8): 0x99, 0x04 -> FAILURE | ||||||
|  | // f(int8,int8): 0x99, 0x08 -> FAILURE | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | contract C { | ||||||
|  |     uint256 x; | ||||||
|  | 
 | ||||||
|  |     function f() public returns (uint256) { | ||||||
|  |         x = 3; | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | interface CView { | ||||||
|  |     function f() external view returns (uint256); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | interface CPure { | ||||||
|  |     function f() external pure returns (uint256); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract D { | ||||||
|  |     function f() public returns (uint256) { | ||||||
|  |         return (new C()).f(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function fview() public returns (uint256) { | ||||||
|  |         return (CView(address(new C()))).f(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function fpure() public returns (uint256) { | ||||||
|  |         return (CPure(address(new C()))).f(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: >=byzantium | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x1 # This should work, next should throw # | ||||||
|  | // fview() -> FAILURE | ||||||
|  | // fpure() -> FAILURE | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | contract C { | ||||||
|  |     uint256 x; | ||||||
|  | 
 | ||||||
|  |     function f() public returns (uint256) { | ||||||
|  |         x = 3; | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | interface CView { | ||||||
|  |     function f() external view returns (uint256); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | interface CPure { | ||||||
|  |     function f() external pure returns (uint256); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | contract D { | ||||||
|  |     function f() public returns (uint256) { | ||||||
|  |         return (new C()).f(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function fview() public returns (uint256) { | ||||||
|  |         return (CView(address(new C()))).f(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function fpure() public returns (uint256) { | ||||||
|  |         return (CPure(address(new C()))).f(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // EVMVersion: <byzantium | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x1 | ||||||
|  | // fview() -> 1 | ||||||
|  | // fpure() -> 1 | ||||||
| @ -0,0 +1,20 @@ | |||||||
|  | contract Sample { | ||||||
|  |     struct s { | ||||||
|  |         uint16 x; | ||||||
|  |         uint16 y; | ||||||
|  |         string a; | ||||||
|  |         string b; | ||||||
|  |     } | ||||||
|  |     s[2] public p; | ||||||
|  | 
 | ||||||
|  |     constructor() public { | ||||||
|  |         s memory m; | ||||||
|  |         m.x = 0xbbbb; | ||||||
|  |         m.y = 0xcccc; | ||||||
|  |         m.a = "hello"; | ||||||
|  |         m.b = "world"; | ||||||
|  |         p[0] = m; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // p(uint256): 0x0 -> 0xbbbb, 0xcccc, 0x80, 0xc0, 0x05, "hello", 0x05, "world" | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | contract Test { | ||||||
|  |     string s; | ||||||
|  |     bytes b; | ||||||
|  | 
 | ||||||
|  |     function f(string memory _s, uint256 n) public returns (bytes1) { | ||||||
|  |         b = bytes(_s); | ||||||
|  |         s = string(b); | ||||||
|  |         return bytes(s)[n]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function l() public returns (uint256) { | ||||||
|  |         return bytes(s).length; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // f(string,uint256): 0x40, 0x02, 0x06, "abcdef" -> "c" | ||||||
|  | // l() -> 0x06 | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | contract buggystruct { | ||||||
|  |     Buggy public bug; | ||||||
|  | 
 | ||||||
|  |     struct Buggy { | ||||||
|  |         uint256 first; | ||||||
|  |         uint256 second; | ||||||
|  |         uint256 third; | ||||||
|  |         string last; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     constructor() public { | ||||||
|  |         bug = Buggy(10, 20, 30, "asdfghjkl"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getFirst() public returns (uint256) { | ||||||
|  |         return bug.first; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getSecond() public returns (uint256) { | ||||||
|  |         return bug.second; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getThird() public returns (uint256) { | ||||||
|  |         return bug.third; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function getLast() public returns (string memory) { | ||||||
|  |         return bug.last; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // getFirst() -> 0x0a | ||||||
|  | // getSecond() -> 0x14 | ||||||
|  | // getThird() -> 0x1e | ||||||
|  | // getLast() -> 0x20, 0x09, "asdfghjkl" | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | contract C { | ||||||
|  |     struct X { | ||||||
|  |         uint256 x1; | ||||||
|  |         uint256 x2; | ||||||
|  |     } | ||||||
|  |     struct S { | ||||||
|  |         uint256 s1; | ||||||
|  |         uint256[3] s2; | ||||||
|  |         X s3; | ||||||
|  |     } | ||||||
|  |     S s; | ||||||
|  | 
 | ||||||
|  |     constructor() public { | ||||||
|  |         uint256[3] memory s2; | ||||||
|  |         s2[1] = 9; | ||||||
|  |         s = S(1, s2, X(4, 5)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function get() | ||||||
|  |         public | ||||||
|  |         returns (uint256 s1, uint256[3] memory s2, uint256 x1, uint256 x2) | ||||||
|  |     { | ||||||
|  |         s1 = s.s1; | ||||||
|  |         s2 = s.s2; | ||||||
|  |         x1 = s.s3.x1; | ||||||
|  |         x2 = s.s3.x2; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // get() -> 0x01, 0x00, 0x09, 0x00, 0x04, 0x05 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user