mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #6704 from ethereum/abiEncodeV2Cleanup
Add ABIEncoderV2 cleanup tests.
This commit is contained in:
commit
f61348728c
@ -0,0 +1,31 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function g(address x) external pure returns (uint256 r) {
|
||||
assembly { r := x }
|
||||
}
|
||||
function f(uint256 a) external view returns (uint256) {
|
||||
address x;
|
||||
assembly { x := a }
|
||||
return this.g(x);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// f(uint256): 0 -> 0
|
||||
// g(address): 0 -> 0 # test validation as well as sanity check #
|
||||
// f(uint256): 1 -> 1
|
||||
// g(address): 1 -> 1
|
||||
// f(uint256): 2 -> 2
|
||||
// g(address): 2 -> 2
|
||||
// f(uint256): 0xabcdef0123456789abcdef0123456789abcdefff -> 0xabcdef0123456789abcdef0123456789abcdefff
|
||||
// g(address): 0xabcdef0123456789abcdef0123456789abcdefff -> 0xabcdef0123456789abcdef0123456789abcdefff
|
||||
// f(uint256): 0xffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
|
||||
// g(address): 0xffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
|
||||
// f(uint256): 0x010000000000000000000000000000000000000000 -> 0
|
||||
// g(address): 0x010000000000000000000000000000000000000000 -> FAILURE
|
||||
// f(uint256): 0x01abcdef0123456789abcdef0123456789abcdefff -> 0xabcdef0123456789abcdef0123456789abcdefff
|
||||
// g(address): 0x01abcdef0123456789abcdef0123456789abcdefff -> FAILURE
|
||||
// f(uint256): 0x01ffffffffffffffffffffffffffffffffffffffff -> 0xffffffffffffffffffffffffffffffffffffffff
|
||||
// g(address): 0x01ffffffffffffffffffffffffffffffffffffffff -> FAILURE
|
||||
// f(uint256): -1 -> 0xffffffffffffffffffffffffffffffffffffffff
|
||||
// g(address): -1 -> FAILURE
|
21
test/libsolidity/semanticTests/abiEncoderV2/cleanup/bool.sol
Normal file
21
test/libsolidity/semanticTests/abiEncoderV2/cleanup/bool.sol
Normal file
@ -0,0 +1,21 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function gggg(bool x) external pure returns (bool) {
|
||||
return x;
|
||||
}
|
||||
function f(uint256 a) external view returns (bool) {
|
||||
bool x = false;
|
||||
assembly { x := a }
|
||||
return this.gggg(x);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// f(uint256): 0 -> false
|
||||
// gggg(bool): 0 -> false # test validation as well as sanity check #
|
||||
// f(uint256): 1 -> true
|
||||
// gggg(bool): 1 -> true
|
||||
// f(uint256): 2 -> true
|
||||
// gggg(bool): 2 -> FAILURE
|
||||
// f(uint256): 0x1000 -> true
|
||||
// gggg(bool): 0x1000 -> FAILURE
|
115
test/libsolidity/semanticTests/abiEncoderV2/cleanup/bytesx.sol
Normal file
115
test/libsolidity/semanticTests/abiEncoderV2/cleanup/bytesx.sol
Normal file
@ -0,0 +1,115 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function gg1(bytes1 x) external pure returns (bytes32) {
|
||||
return x;
|
||||
}
|
||||
function f1(bytes32 a) external view returns (bytes32) {
|
||||
bytes1 x;
|
||||
assembly { x := a }
|
||||
return this.gg1(x);
|
||||
}
|
||||
function gg2(bytes2 x) external pure returns (bytes32) {
|
||||
return x;
|
||||
}
|
||||
function f2(bytes32 a) external view returns (bytes32) {
|
||||
bytes2 x;
|
||||
assembly { x := a }
|
||||
return this.gg2(x);
|
||||
}
|
||||
function gg4(bytes4 x) external pure returns (bytes32) {
|
||||
return x;
|
||||
}
|
||||
function f4(bytes32 a) external view returns (bytes32) {
|
||||
bytes4 x;
|
||||
assembly { x := a }
|
||||
return this.gg4(x);
|
||||
}
|
||||
function gg8(bytes8 x) external pure returns (bytes32) {
|
||||
return x;
|
||||
}
|
||||
function f8(bytes32 a) external view returns (bytes32) {
|
||||
bytes8 x;
|
||||
assembly { x := a }
|
||||
return this.gg8(x);
|
||||
}
|
||||
function g16(bytes16 x) external pure returns (bytes32) {
|
||||
return x;
|
||||
}
|
||||
function f16(bytes32 a) external view returns (bytes32) {
|
||||
bytes16 x;
|
||||
assembly { x := a }
|
||||
return this.g16(x);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// f1(bytes32): left(0) -> left(0)
|
||||
// gg1(bytes1): left(0) -> left(0) # test validation as well as sanity check #
|
||||
// f1(bytes32): left(1) -> left(1)
|
||||
// gg1(bytes1): left(1) -> left(1)
|
||||
// f1(bytes32): left(0xFE) -> left(0xFE)
|
||||
// gg1(bytes1): left(0xFE) -> left(0xFE)
|
||||
// f1(bytes32): left(0xFF) -> left(0xFF)
|
||||
// gg1(bytes1): left(0xFF) -> left(0xFF)
|
||||
// f1(bytes32): left(0x0001) -> left(0x00)
|
||||
// gg1(bytes1): left(0x0001) -> FAILURE
|
||||
// f1(bytes32): left(0x0101) -> left(0x01)
|
||||
// gg1(bytes1): left(0x0101) -> FAILURE
|
||||
// f1(bytes32): -1 -> left(0xFF)
|
||||
// gg1(bytes1): -1 -> FAILURE
|
||||
// f2(bytes32): left(0) -> left(0)
|
||||
// gg2(bytes2): left(0) -> left(0)
|
||||
// f2(bytes32): left(1) -> left(1)
|
||||
// gg2(bytes2): left(1) -> left(1)
|
||||
// f2(bytes32): left(0xFFFE) -> left(0xFFFE)
|
||||
// gg2(bytes2): left(0xFFFE) -> left(0xFFFE)
|
||||
// f2(bytes32): left(0xFFFF) -> left(0xFFFF)
|
||||
// gg2(bytes2): left(0xFFFF) -> left(0xFFFF)
|
||||
// f2(bytes32): left(0x000001) -> left(0x00)
|
||||
// gg2(bytes2): left(0x000001) -> FAILURE
|
||||
// f2(bytes32): left(0x010001) -> left(0x01)
|
||||
// gg2(bytes2): left(0x010001) -> FAILURE
|
||||
// f2(bytes32): -1 -> left(0xFFFF)
|
||||
// gg2(bytes2): -1 -> FAILURE
|
||||
// f4(bytes32): left(0) -> left(0)
|
||||
// gg4(bytes4): left(0) -> left(0)
|
||||
// f4(bytes32): left(1) -> left(1)
|
||||
// gg4(bytes4): left(1) -> left(1)
|
||||
// f4(bytes32): left(0xFFFFFFFE) -> left(0xFFFFFFFE)
|
||||
// gg4(bytes4): left(0xFFFFFFFE) -> left(0xFFFFFFFE)
|
||||
// f4(bytes32): left(0xFFFFFFFF) -> left(0xFFFFFFFF)
|
||||
// gg4(bytes4): left(0xFFFFFFFF) -> left(0xFFFFFFFF)
|
||||
// f4(bytes32): left(0x0000000001) -> left(0x00)
|
||||
// gg4(bytes4): left(0x0000000001) -> FAILURE
|
||||
// f4(bytes32): left(0x0100000001) -> left(0x01)
|
||||
// gg4(bytes4): left(0x0100000001) -> FAILURE
|
||||
// f4(bytes32): -1 -> left(0xFFFFFFFF)
|
||||
// gg4(bytes4): -1 -> FAILURE
|
||||
// f8(bytes32): left(0) -> left(0)
|
||||
// gg8(bytes8): left(0) -> left(0)
|
||||
// f8(bytes32): left(1) -> left(1)
|
||||
// gg8(bytes8): left(1) -> left(1)
|
||||
// f8(bytes32): left(0xFFFFFFFFFFFFFFFE) -> left(0xFFFFFFFFFFFFFFFE)
|
||||
// gg8(bytes8): left(0xFFFFFFFFFFFFFFFE) -> left(0xFFFFFFFFFFFFFFFE)
|
||||
// f8(bytes32): left(0xFFFFFFFFFFFFFFFF) -> left(0xFFFFFFFFFFFFFFFF)
|
||||
// gg8(bytes8): left(0xFFFFFFFFFFFFFFFF) -> left(0xFFFFFFFFFFFFFFFF)
|
||||
// f8(bytes32): left(0x000000000000000001) -> left(0x00)
|
||||
// gg8(bytes8): left(0x000000000000000001) -> FAILURE
|
||||
// f8(bytes32): left(0x010000000000000001) -> left(0x01)
|
||||
// gg8(bytes8): left(0x010000000000000001) -> FAILURE
|
||||
// f8(bytes32): -1 -> left(0xFFFFFFFFFFFFFFFF)
|
||||
// gg8(bytes8): -1 -> FAILURE
|
||||
// f16(bytes32): left(0) -> left(0)
|
||||
// g16(bytes16): left(0) -> left(0)
|
||||
// f16(bytes32): left(1) -> left(1)
|
||||
// g16(bytes16): left(1) -> left(1)
|
||||
// f16(bytes32): left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) -> left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE)
|
||||
// g16(bytes16): left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) -> left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE)
|
||||
// f16(bytes32): left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) -> left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
|
||||
// g16(bytes16): left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) -> left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
|
||||
// f16(bytes32): left(0x0000000000000000000000000000000001) -> left(0x00)
|
||||
// g16(bytes16): left(0x0000000000000000000000000000000001) -> FAILURE
|
||||
// f16(bytes32): left(0x0100000000000000000000000000000001) -> left(0x01)
|
||||
// g16(bytes16): left(0x0100000000000000000000000000000001) -> FAILURE
|
||||
// f16(bytes32): -1 -> left(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
|
||||
// g16(bytes16): -1 -> FAILURE
|
@ -0,0 +1,22 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function ggg(uint8[] calldata s) external pure returns (bytes memory) {
|
||||
s[0]; // only this will validate.
|
||||
return msg.data;
|
||||
}
|
||||
function f(uint256[] calldata a) external returns (bytes memory) {
|
||||
uint8[] memory m = new uint8[](a.length);
|
||||
assembly {
|
||||
calldatacopy(add(m, 0x20), 0x44, mul(calldataload(4), 0x20))
|
||||
}
|
||||
return this.ggg(m);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// EVMVersion: >homestead
|
||||
// ----
|
||||
// f(uint256[]): 0x20, 2, 1, 1 -> 0x20, 0x84, hex"304a4c23", 0x20, 2, 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// ggg(uint8[]): 0x20, 2, 1, 1 -> 0x20, 0x84, hex"304a4c23", 0x20, 2, 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// f(uint256[]): 0x20, 2, 0x0101, 0x0101 -> 0x20, 0x84, hex"304a4c23", 0x20, 2, 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// ggg(uint8[]): 0x20, 2, 0x0101, 0x0101 -> FAILURE
|
@ -0,0 +1,28 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
struct S { function() external f; }
|
||||
function ggg(function() external x) external pure returns (uint256 r) {
|
||||
assembly { r := calldataload(4) }
|
||||
}
|
||||
function h(S calldata x) external pure returns (uint256 r) {
|
||||
x.f; // validation only happens here
|
||||
assembly { r := calldataload(4) }
|
||||
}
|
||||
function dummy() external {}
|
||||
function ffff(uint256 a) external view returns (uint256, uint256) {
|
||||
S memory s = S(this.dummy);
|
||||
assembly { mstore(s, a) }
|
||||
return (this.ggg(s.f), this.h(s));
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// ffff(uint256): 0 -> 0, 0
|
||||
// ggg(function): 0 -> 0
|
||||
// ffff(uint256): "01234567890123456789abcd" -> "01234567890123456789abcd", "01234567890123456789abcd"
|
||||
// ggg(function): "01234567890123456789abcd" -> "01234567890123456789abcd"
|
||||
// h((function)): "01234567890123456789abcd" -> "01234567890123456789abcd"
|
||||
// h((function)): 0 -> 0
|
||||
// ffff(uint256): "01234567890123456789abcdX" -> "01234567890123456789abcd", "01234567890123456789abcd"
|
||||
// ggg(function): "01234567890123456789abcdX" -> FAILURE
|
||||
// h((function)): "01234567890123456789abcdX" -> FAILURE
|
155
test/libsolidity/semanticTests/abiEncoderV2/cleanup/intx.sol
Normal file
155
test/libsolidity/semanticTests/abiEncoderV2/cleanup/intx.sol
Normal file
@ -0,0 +1,155 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function ggg8(int8 x) external pure returns (int256) {
|
||||
return x;
|
||||
}
|
||||
function gg16(int16 x) external pure returns (int256) {
|
||||
return x;
|
||||
}
|
||||
function gg32(int32 x) external pure returns (int256) {
|
||||
return x;
|
||||
}
|
||||
function gg64(int64 x) external pure returns (int256) {
|
||||
return x;
|
||||
}
|
||||
function g128(int128 x) external pure returns (int256) {
|
||||
return x;
|
||||
}
|
||||
function f8(int256 a) external view returns (int256) {
|
||||
int8 x = 0;
|
||||
assembly { x := a }
|
||||
return this.ggg8(x);
|
||||
}
|
||||
function f16(int256 a) external view returns (int256) {
|
||||
int16 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg16(x);
|
||||
}
|
||||
function f32(int256 a) external view returns (int256) {
|
||||
int32 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg32(x);
|
||||
}
|
||||
function f64(int256 a) external view returns (int256) {
|
||||
int64 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg64(x);
|
||||
}
|
||||
function f128(int256 a) external view returns (int256) {
|
||||
int128 x = 0;
|
||||
assembly { x := a }
|
||||
return this.g128(x);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// f8(int256): 0 -> 0
|
||||
// ggg8(int8): 0 -> 0 # test validation as well as sanity check #
|
||||
// f8(int256): 1 -> 1
|
||||
// ggg8(int8): 1 -> 1
|
||||
// f8(int256): -1 -> -1
|
||||
// ggg8(int8): -1 -> -1
|
||||
// f8(int256): 0x7F -> 0x7F
|
||||
// ggg8(int8): 0x7F -> 0x7F
|
||||
// f8(int256): 0x80 -> -128
|
||||
// ggg8(int8): 0x80 -> FAILURE
|
||||
// f8(int256): 0xFE -> -2
|
||||
// ggg8(int8): 0xFE -> FAILURE
|
||||
// f8(int256): 0xFF -> -1
|
||||
// ggg8(int8): 0xFF -> FAILURE
|
||||
// f8(int256): 0x0100 -> 0x00
|
||||
// ggg8(int8): 0x0100 -> FAILURE
|
||||
// f8(int256): 0x0101 -> 0x01
|
||||
// ggg8(int8): 0x0101 -> FAILURE
|
||||
// f8(int256): 0x01FF -> -1
|
||||
// ggg8(int8): 0x01FF -> FAILURE
|
||||
// f8(int256): 0x01FE -> -2
|
||||
// ggg8(int8): 0x01FE -> FAILURE
|
||||
// f16(int256): 0 -> 0
|
||||
// gg16(int16): 0 -> 0
|
||||
// f16(int256): 1 -> 1
|
||||
// gg16(int16): 1 -> 1
|
||||
// f16(int256): -1 -> -1
|
||||
// gg16(int16): -1 -> -1
|
||||
// f16(int256): 0x7FFF -> 0x7FFF
|
||||
// gg16(int16): 0x7FFF -> 0x7FFF
|
||||
// f16(int256): 0x8000 -> -32768
|
||||
// gg16(int16): 0x8000 -> FAILURE
|
||||
// f16(int256): 0xFFFE -> -2
|
||||
// gg16(int16): 0xFFFE -> FAILURE
|
||||
// f16(int256): 0xFFFF -> -1
|
||||
// gg16(int16): 0xFFFF -> FAILURE
|
||||
// f16(int256): 0x010000 -> 0x00
|
||||
// gg16(int16): 0x010000 -> FAILURE
|
||||
// f16(int256): 0x010001 -> 0x01
|
||||
// gg16(int16): 0x010001 -> FAILURE
|
||||
// f16(int256): 0x01FFFF -> -1
|
||||
// gg16(int16): 0x01FFFF -> FAILURE
|
||||
// f16(int256): 0x01FFFE -> -2
|
||||
// gg16(int16): 0x01FFFE -> FAILURE
|
||||
// f32(int256): 0 -> 0
|
||||
// gg32(int32): 0 -> 0
|
||||
// f32(int256): 1 -> 1
|
||||
// gg32(int32): 1 -> 1
|
||||
// f32(int256): -1 -> -1
|
||||
// gg32(int32): -1 -> -1
|
||||
// f32(int256): 0x7FFFFFFF -> 0x7FFFFFFF
|
||||
// gg32(int32): 0x7FFFFFFF -> 0x7FFFFFFF
|
||||
// f32(int256): 0x80000000 -> -2147483648
|
||||
// gg32(int32): 0x80000000 -> FAILURE
|
||||
// f32(int256): 0xFFFFFFFE -> -2
|
||||
// gg32(int32): 0xFFFFFFFE -> FAILURE
|
||||
// f32(int256): 0xFFFFFFFF -> -1
|
||||
// gg32(int32): 0xFFFFFFFF -> FAILURE
|
||||
// f32(int256): 0x0100000000 -> 0x00
|
||||
// gg32(int32): 0x0100000000 -> FAILURE
|
||||
// f32(int256): 0x0100000001 -> 0x01
|
||||
// gg32(int32): 0x0100000001 -> FAILURE
|
||||
// f32(int256): 0x01FFFFFFFF -> -1
|
||||
// gg32(int32): 0x01FFFFFFFF -> FAILURE
|
||||
// f32(int256): 0x01FFFFFFFE -> -2
|
||||
// gg32(int32): 0x01FFFFFFFE -> FAILURE
|
||||
// f64(int256): 0 -> 0
|
||||
// gg64(int64): 0 -> 0
|
||||
// f64(int256): 1 -> 1
|
||||
// gg64(int64): 1 -> 1
|
||||
// f64(int256): -1 -> -1
|
||||
// gg64(int64): -1 -> -1
|
||||
// f64(int256): 0x7FFFFFFFFFFFFFFF -> 0x7FFFFFFFFFFFFFFF
|
||||
// gg64(int64): 0x7FFFFFFFFFFFFFFF -> 0x7FFFFFFFFFFFFFFF
|
||||
// f64(int256): 0x8000000000000000 -> -9223372036854775808
|
||||
// gg64(int64): 0x8000000000000000 -> FAILURE
|
||||
// f64(int256): 0xFFFFFFFFFFFFFFFE -> -2
|
||||
// gg64(int64): 0xFFFFFFFFFFFFFFFE -> FAILURE
|
||||
// f64(int256): 0xFFFFFFFFFFFFFFFF -> -1
|
||||
// gg64(int64): 0xFFFFFFFFFFFFFFFF -> FAILURE
|
||||
// f64(int256): 0x010000000000000000 -> 0x00
|
||||
// gg64(int64): 0x010000000000000000 -> FAILURE
|
||||
// f64(int256): 0x010000000000000001 -> 0x01
|
||||
// gg64(int64): 0x010000000000000001 -> FAILURE
|
||||
// f64(int256): 0x01FFFFFFFFFFFFFFFF -> -1
|
||||
// gg64(int64): 0x01FFFFFFFFFFFFFFFF -> FAILURE
|
||||
// f64(int256): 0x01FFFFFFFFFFFFFFFE -> -2
|
||||
// gg64(int64): 0x01FFFFFFFFFFFFFFFE -> FAILURE
|
||||
// f128(int256): 0 -> 0
|
||||
// g128(int128): 0 -> 0
|
||||
// f128(int256): 1 -> 1
|
||||
// g128(int128): 1 -> 1
|
||||
// f128(int256): -1 -> -1
|
||||
// g128(int128): -1 -> -1
|
||||
// f128(int256): 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
// g128(int128): 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
// f128(int256): 0x80000000000000000000000000000000 -> -170141183460469231731687303715884105728
|
||||
// g128(int128): 0x80000000000000000000000000000000 -> FAILURE
|
||||
// f128(int256): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> -2
|
||||
// g128(int128): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> FAILURE
|
||||
// f128(int256): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> -1
|
||||
// g128(int128): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> FAILURE
|
||||
// f128(int256): 0x0100000000000000000000000000000000 -> 0x00
|
||||
// g128(int128): 0x0100000000000000000000000000000000 -> FAILURE
|
||||
// f128(int256): 0x0100000000000000000000000000000001 -> 0x01
|
||||
// g128(int128): 0x0100000000000000000000000000000001 -> FAILURE
|
||||
// f128(int256): 0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> -1
|
||||
// g128(int128): 0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> FAILURE
|
||||
// f128(int256): 0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> -2
|
||||
// g128(int128): 0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> FAILURE
|
@ -0,0 +1,24 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
struct S { uint8 a; bytes1 b; }
|
||||
function gg(S calldata s) external pure returns (bytes memory) {
|
||||
s.a; s.b; // only this will validate.
|
||||
return msg.data;
|
||||
}
|
||||
function f(uint256 a, bytes32 b) public returns (bytes memory) {
|
||||
S memory s = S(2,0x02);
|
||||
assembly {
|
||||
mstore(s, a)
|
||||
mstore(add(s, 0x20), b)
|
||||
}
|
||||
return this.gg(s);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// EVMVersion: >homestead
|
||||
// ----
|
||||
// f(uint256,bytes32): 1, left(0x01) -> 0x20, 0x44, hex"b63240b0", 1, left(0x01), hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// gg((uint8,bytes1)): 1, left(0x01) -> 0x20, 0x44, hex"b63240b0", 1, left(0x01), hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// f(uint256,bytes32): 0x0101, left(0x0101) -> 0x20, 0x44, hex"b63240b0", 1, left(0x01), hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// gg((uint8,bytes1)): 0x0101, left(0x0101) -> FAILURE
|
@ -0,0 +1,23 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function gggggggg(uint8[2] calldata s) external pure returns (bytes memory) {
|
||||
s[0]; // only this will validate.
|
||||
return msg.data;
|
||||
}
|
||||
function f(uint256 a, uint256 b) public returns (bytes memory) {
|
||||
uint8[2] memory m = [0,0];
|
||||
assembly {
|
||||
mstore(m, a)
|
||||
mstore(add(m, 0x20), b)
|
||||
}
|
||||
return this.gggggggg(m);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// EVMVersion: >homestead
|
||||
// ----
|
||||
// f(uint256,uint256): 1, 1 -> 0x20, 0x44, hex"78b86ac6", 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// gggggggg(uint8[2]): 1, 1 -> 0x20, 0x44, hex"78b86ac6", 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// f(uint256,uint256): 0x0101, 0x0101 -> 0x20, 0x44, hex"78b86ac6", 1, 1, hex"00000000000000000000000000000000000000000000000000000000"
|
||||
// gggggggg(uint8[2]): 0x0101, 0x0101 -> FAILURE
|
115
test/libsolidity/semanticTests/abiEncoderV2/cleanup/uintx.sol
Normal file
115
test/libsolidity/semanticTests/abiEncoderV2/cleanup/uintx.sol
Normal file
@ -0,0 +1,115 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function ggg8(uint8 x) external pure returns (uint256) {
|
||||
return x;
|
||||
}
|
||||
function gg16(uint16 x) external pure returns (uint256) {
|
||||
return x;
|
||||
}
|
||||
function gg32(uint32 x) external pure returns (uint256) {
|
||||
return x;
|
||||
}
|
||||
function gg64(uint64 x) external pure returns (uint256) {
|
||||
return x;
|
||||
}
|
||||
function g128(uint128 x) external pure returns (uint256) {
|
||||
return x;
|
||||
}
|
||||
function f8(uint256 a) external view returns (uint256) {
|
||||
uint8 x = 0;
|
||||
assembly { x := a }
|
||||
return this.ggg8(x);
|
||||
}
|
||||
function f16(uint256 a) external view returns (uint256) {
|
||||
uint16 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg16(x);
|
||||
}
|
||||
function f32(uint256 a) external view returns (uint256) {
|
||||
uint32 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg32(x);
|
||||
}
|
||||
function f64(uint256 a) external view returns (uint256) {
|
||||
uint64 x = 0;
|
||||
assembly { x := a }
|
||||
return this.gg64(x);
|
||||
}
|
||||
function f128(uint256 a) external view returns (uint256) {
|
||||
uint128 x = 0;
|
||||
assembly { x := a }
|
||||
return this.g128(x);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// f8(uint256): 0 -> 0
|
||||
// ggg8(uint8): 0 -> 0 # test validation as well as sanity check #
|
||||
// f8(uint256): 1 -> 1
|
||||
// ggg8(uint8): 1 -> 1
|
||||
// f8(uint256): 0xFE -> 0xFE
|
||||
// ggg8(uint8): 0xFE -> 0xFE
|
||||
// f8(uint256): 0xFF -> 0xFF
|
||||
// ggg8(uint8): 0xFF -> 0xFF
|
||||
// f8(uint256): 0x0100 -> 0x00
|
||||
// ggg8(uint8): 0x0100 -> FAILURE
|
||||
// f8(uint256): 0x0101 -> 0x01
|
||||
// ggg8(uint8): 0x0101 -> FAILURE
|
||||
// f8(uint256): -1 -> 0xFF
|
||||
// ggg8(uint8): -1 -> FAILURE
|
||||
// f16(uint256): 0 -> 0
|
||||
// gg16(uint16): 0 -> 0
|
||||
// f16(uint256): 1 -> 1
|
||||
// gg16(uint16): 1 -> 1
|
||||
// f16(uint256): 0xFFFE -> 0xFFFE
|
||||
// gg16(uint16): 0xFFFE -> 0xFFFE
|
||||
// f16(uint256): 0xFFFF -> 0xFFFF
|
||||
// gg16(uint16): 0xFFFF -> 0xFFFF
|
||||
// f16(uint256): 0x010000 -> 0x0000
|
||||
// gg16(uint16): 0x010000 -> FAILURE
|
||||
// f16(uint256): 0x010001 -> 0x0001
|
||||
// gg16(uint16): 0x010001 -> FAILURE
|
||||
// f16(uint256): -1 -> 0xFFFF
|
||||
// gg16(uint16): -1 -> FAILURE
|
||||
// f32(uint256): 0 -> 0
|
||||
// gg32(uint32): 0 -> 0
|
||||
// f32(uint256): 1 -> 1
|
||||
// gg32(uint32): 1 -> 1
|
||||
// f32(uint256): 0xFFFFFFFE -> 0xFFFFFFFE
|
||||
// gg32(uint32): 0xFFFFFFFE -> 0xFFFFFFFE
|
||||
// f32(uint256): 0xFFFFFFFF -> 0xFFFFFFFF
|
||||
// gg32(uint32): 0xFFFFFFFF -> 0xFFFFFFFF
|
||||
// f32(uint256): 0x0100000000 -> 0x00000000
|
||||
// gg32(uint32): 0x0100000000 -> FAILURE
|
||||
// f32(uint256): 0x0100000001 -> 0x00000001
|
||||
// gg32(uint32): 0x0100000001 -> FAILURE
|
||||
// f32(uint256): -1 -> 0xFFFFFFFF
|
||||
// gg32(uint32): -1 -> FAILURE
|
||||
// f64(uint256): 0 -> 0
|
||||
// gg64(uint64): 0 -> 0
|
||||
// f64(uint256): 1 -> 1
|
||||
// gg64(uint64): 1 -> 1
|
||||
// f64(uint256): 0xFFFFFFFFFFFFFFFE -> 0xFFFFFFFFFFFFFFFE
|
||||
// gg64(uint64): 0xFFFFFFFFFFFFFFFE -> 0xFFFFFFFFFFFFFFFE
|
||||
// f64(uint256): 0xFFFFFFFFFFFFFFFF -> 0xFFFFFFFFFFFFFFFF
|
||||
// gg64(uint64): 0xFFFFFFFFFFFFFFFF -> 0xFFFFFFFFFFFFFFFF
|
||||
// f64(uint256): 0x010000000000000000 -> 0x0000000000000000
|
||||
// gg64(uint64): 0x010000000000000000 -> FAILURE
|
||||
// f64(uint256): 0x010000000000000001 -> 0x0000000000000001
|
||||
// gg64(uint64): 0x010000000000000001 -> FAILURE
|
||||
// f64(uint256): -1 -> 0xFFFFFFFFFFFFFFFF
|
||||
// gg64(uint64): -1 -> FAILURE
|
||||
// f128(uint256): 0 -> 0
|
||||
// g128(uint128): 0 -> 0
|
||||
// f128(uint256): 1 -> 1
|
||||
// g128(uint128): 1 -> 1
|
||||
// f128(uint256): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
|
||||
// g128(uint128): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -> 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
|
||||
// f128(uint256): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
// g128(uint128): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
// f128(uint256): 0x0100000000000000000000000000000000 -> 0x00000000000000000000000000000000
|
||||
// g128(uint128): 0x0100000000000000000000000000000000 -> FAILURE
|
||||
// f128(uint256): 0x0100000000000000000000000000000001 -> 0x00000000000000000000000000000001
|
||||
// g128(uint128): 0x0100000000000000000000000000000001 -> FAILURE
|
||||
// f128(uint256): -1 -> 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
// g128(uint128): -1 -> FAILURE
|
Loading…
Reference in New Issue
Block a user