diff --git a/test/libsolidity/semanticTests/literals/denominations_in_array_sizes.sol b/test/libsolidity/semanticTests/literals/denominations_in_array_sizes.sol new file mode 100644 index 000000000..43a09af05 --- /dev/null +++ b/test/libsolidity/semanticTests/literals/denominations_in_array_sizes.sol @@ -0,0 +1,25 @@ +contract C { + uint[2 wei] a; + uint[2 gwei] b; + uint[2 ether] c; + uint[2 seconds] d; + uint[2 minutes] e; + uint[2 hours] f; + uint[2 days] g; + uint[2 weeks] h; + + function lengths() public returns (uint, uint, uint, uint, uint, uint, uint, uint) { + return ( + a.length, + b.length, + c.length, + d.length, + e.length, + f.length, + g.length, + h.length + ); + } +} +// ---- +// lengths() -> 2, 2000000000, 2000000000000000000, 2, 120, 7200, 172800, 1209600 diff --git a/test/libsolidity/semanticTests/literals/fractional_denominations.sol b/test/libsolidity/semanticTests/literals/fractional_denominations.sol new file mode 100644 index 000000000..6bc448f09 --- /dev/null +++ b/test/libsolidity/semanticTests/literals/fractional_denominations.sol @@ -0,0 +1,15 @@ +contract C { + uint public g = 1.5 gwei; + uint public e = 1.5 ether; + uint public m = 1.5 minutes; + uint public h = 1.5 hours; + uint public d = 1.5 days; + uint public w = 1.5 weeks; +} +// ---- +// g() -> 1500000000 +// e() -> 1500000000000000000 +// m() -> 90 +// h() -> 5400 +// d() -> 129600 +// w() -> 907200 diff --git a/test/libsolidity/semanticTests/operators/userDefined/operator_parameter_and_return_cleanup_between_calls.sol b/test/libsolidity/semanticTests/operators/userDefined/operator_parameter_and_return_cleanup_between_calls.sol new file mode 100644 index 000000000..b51ad8dad --- /dev/null +++ b/test/libsolidity/semanticTests/operators/userDefined/operator_parameter_and_return_cleanup_between_calls.sol @@ -0,0 +1,22 @@ +type U8 is uint8; +using {yoloAdd as +, yoloDiv as /} for U8 global; + +function yoloAdd(U8 x, U8 y) pure returns (U8 z) { + assembly { + z := add(x, y) // Wrong! No cleanup. + } +} + +function yoloDiv(U8 x, U8 y) pure returns (U8 z) { + assembly { + z := div(x, y) // Wrong! No cleanup. + } +} + +contract C { + function divAddNoOverflow(U8 a, U8 b, U8 c) external pure returns (U8) { + return a / (b + c); + } +} +// ---- +// divAddNoOverflow(uint8,uint8,uint8): 4, 0xff, 3 -> 0 diff --git a/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_internal.sol b/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_internal.sol new file mode 100644 index 000000000..cee1bcdde --- /dev/null +++ b/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_internal.sol @@ -0,0 +1,23 @@ +contract A { + function f() internal virtual { + mutableWithViewOverride(); + mutableWithPureOverride(); + viewWithPureOverride(); + } + + function mutableWithViewOverride() internal virtual {} + function mutableWithPureOverride() internal virtual {} + function viewWithPureOverride() internal view virtual {} +} + +contract C is A { + function run() public { + f(); + } + + function mutableWithViewOverride() internal view override {} + function mutableWithPureOverride() internal pure override {} + function viewWithPureOverride() internal pure override {} +} +// ---- +// run() -> diff --git a/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_public.sol b/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_public.sol new file mode 100644 index 000000000..c3d9e60a0 --- /dev/null +++ b/test/libsolidity/semanticTests/virtualFunctions/virtual_override_changing_mutability_public.sol @@ -0,0 +1,23 @@ +contract A { + function f() internal virtual { + mutableWithViewOverride(); + mutableWithPureOverride(); + viewWithPureOverride(); + } + + function mutableWithViewOverride() public virtual {} + function mutableWithPureOverride() public virtual {} + function viewWithPureOverride() public view virtual {} +} + +contract C is A { + function run() public { + f(); + } + + function mutableWithViewOverride() public view override {} + function mutableWithPureOverride() public pure override {} + function viewWithPureOverride() public pure override {} +} +// ---- +// run() -> diff --git a/test/libsolidity/syntaxTests/denominations/denominations_in_array_sizes.sol b/test/libsolidity/syntaxTests/denominations/denominations_in_array_sizes.sol new file mode 100644 index 000000000..46c7a0d87 --- /dev/null +++ b/test/libsolidity/syntaxTests/denominations/denominations_in_array_sizes.sol @@ -0,0 +1,12 @@ +contract C { + uint[42 wei] a; + uint[42 gwei] b; + uint[42 ether] c; + uint[42 seconds] d; + uint[42 minutes] e; + uint[42 hours] f; + uint[42 days] g; + uint[42 weeks] h; +} +// ---- +// Warning 7325: (58-72): Type uint256[42000000000000000000] covers a large part of storage and thus makes collisions likely. Either use mappings or dynamic arrays and allow their size to be increased only in small quantities per transaction. diff --git a/test/libsolidity/syntaxTests/denominations/invalid_denomination_address.sol b/test/libsolidity/syntaxTests/denominations/invalid_denomination_address.sol new file mode 100644 index 000000000..8eec22dee --- /dev/null +++ b/test/libsolidity/syntaxTests/denominations/invalid_denomination_address.sol @@ -0,0 +1,5 @@ +contract C { + address a = 0x11111122222333334444455555666667777788888 wei; +} +// ---- +// TypeError 5145: (26-73): Hexadecimal numbers cannot be used with unit denominations. You can use an expression of the form "0x1234 * 1 day" instead. diff --git a/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_bool.sol b/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_bool.sol new file mode 100644 index 000000000..58d7d205e --- /dev/null +++ b/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_bool.sol @@ -0,0 +1,5 @@ +contract C { + bool constant x = true ether; +} +// ---- +// ParserError 2314: (37-42): Expected ';' but got 'ether' diff --git a/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_string.sol b/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_string.sol new file mode 100644 index 000000000..9d27c5d3d --- /dev/null +++ b/test/libsolidity/syntaxTests/denominations/invalid_denomination_on_string.sol @@ -0,0 +1,5 @@ +contract C { + string s = "abc" ether; +} +// ---- +// ParserError 2314: (31-36): Expected ';' but got 'ether'