From f5be38bff10b02ab5b7bc1125daa6fbe17f87b65 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 4 Jul 2018 11:25:45 +0200 Subject: Extend view pure test suite. --- .../syntaxTests/viewPureChecker/assembly_jump.sol | 7 ------- .../assembly_jump_no_restrict_warning.sol | 7 +++++++ .../viewPureChecker/assembly_jump_view_fail.sol | 8 ++++++++ .../builtin_functions_restrict_warning.sol | 21 ++++++++++++++++++++ .../builtin_functions_view_fail.sol | 23 ++++++++++++++++++++++ .../call_internal_functions_fail.sol | 9 ++++++--- .../viewPureChecker/constant_restrict_warning.sol | 12 +++++++++++ .../syntaxTests/viewPureChecker/creation.sol | 4 ---- .../creation_no_restrict_warning.sol | 4 ++++ .../viewPureChecker/creation_view_fail.sol | 6 ++++++ .../viewPureChecker/function_types_fail.sol | 18 +++++++++++++++++ .../local_storage_variables_fail.sol | 15 ++++++++++++++ .../syntaxTests/viewPureChecker/modifiers_fail.sol | 12 +++++++++++ .../syntaxTests/viewPureChecker/overriding.sol | 7 ------- .../viewPureChecker/overriding_fail.sol | 16 +++++++++++++++ .../overriding_no_restrict_warning.sol | 7 +++++++ .../viewPureChecker/read_storage_pure_fail.sol | 8 ++++++++ .../viewPureChecker/returning_structs.sol | 14 ------------- .../viewPureChecker/returning_structs_fail.sol | 13 ++++++++++++ .../returning_structs_no_restrict_warning.sol | 14 +++++++++++++ .../syntaxTests/viewPureChecker/selector.sol | 4 ++++ 21 files changed, 194 insertions(+), 35 deletions(-) delete mode 100644 test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol delete mode 100644 test/libsolidity/syntaxTests/viewPureChecker/creation.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol delete mode 100644 test/libsolidity/syntaxTests/viewPureChecker/overriding.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol delete mode 100644 test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol create mode 100644 test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol diff --git a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol deleted file mode 100644 index 418be561..00000000 --- a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol +++ /dev/null @@ -1,7 +0,0 @@ -contract C { - function k() public { - assembly { jump(2) } - } -} -// ---- -// Warning: (58-65): Jump instructions and labels are low-level EVM features that can lead to incorrect stack access. Because of that they are discouraged. Please consider using "switch", "if" or "for" statements instead. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol new file mode 100644 index 00000000..418be561 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol @@ -0,0 +1,7 @@ +contract C { + function k() public { + assembly { jump(2) } + } +} +// ---- +// Warning: (58-65): Jump instructions and labels are low-level EVM features that can lead to incorrect stack access. Because of that they are discouraged. Please consider using "switch", "if" or "for" statements instead. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol new file mode 100644 index 00000000..c1729db7 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol @@ -0,0 +1,8 @@ +contract C { + function k() public view { + assembly { jump(2) } + } +} +// ---- +// Warning: (63-70): Jump instructions and labels are low-level EVM features that can lead to incorrect stack access. Because of that they are discouraged. Please consider using "switch", "if" or "for" statements instead. +// TypeError: (63-70): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol new file mode 100644 index 00000000..0b834022 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol @@ -0,0 +1,21 @@ +contract C { + function f() view public { + bytes32 x = keccak256("abc"); + bytes32 y = sha256("abc"); + address z = ecrecover(bytes32(1), uint8(2), bytes32(3), bytes32(4)); + require(true); + assert(true); + x; y; z; + } + function g() public { + bytes32 x = keccak256("abc"); + bytes32 y = sha256("abc"); + address z = ecrecover(bytes32(1), uint8(2), bytes32(3), bytes32(4)); + require(true); + assert(true); + x; y; z; + } +} +// ---- +// Warning: (17-261): Function state mutability can be restricted to pure +// Warning: (266-505): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol new file mode 100644 index 00000000..9b00fd6d --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol @@ -0,0 +1,23 @@ +contract C { + function f() view public { + address(this).transfer(1); + } + function g() view public { + require(address(this).send(2)); + } + function h() view public { + selfdestruct(address(this)); + } + function i() view public { + require(address(this).delegatecall("")); + } + function j() view public { + require(address(this).call("")); + } +} +// ---- +// TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. +// TypeError: (132-153): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. +// TypeError: (201-228): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. +// TypeError: (283-313): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. +// TypeError: (369-391): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol index 22855c34..e21037bd 100644 --- a/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol +++ b/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol @@ -1,7 +1,10 @@ contract C { + uint x; function f() pure public { g(); } - function g() view public {} + function g() view public { x; } + function h() view public { i(); } + function i() public { x = 2; } } // ---- -// TypeError: (44-47): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". -// Warning: (55-82): Function state mutability can be restricted to pure +// TypeError: (56-59): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". +// TypeError: (130-133): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol new file mode 100644 index 00000000..a4b4a353 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol @@ -0,0 +1,12 @@ +contract C { + uint constant x = 2; + function f() view public returns (uint) { + return x; + } + function g() public returns (uint) { + return x; + } +} +// ---- +// Warning: (42-107): Function state mutability can be restricted to pure +// Warning: (112-172): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/viewPureChecker/creation.sol b/test/libsolidity/syntaxTests/viewPureChecker/creation.sol deleted file mode 100644 index d80edd1b..00000000 --- a/test/libsolidity/syntaxTests/viewPureChecker/creation.sol +++ /dev/null @@ -1,4 +0,0 @@ -contract D {} -contract C { - function f() public { new D(); } -} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol new file mode 100644 index 00000000..d80edd1b --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol @@ -0,0 +1,4 @@ +contract D {} +contract C { + function f() public { new D(); } +} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol new file mode 100644 index 00000000..08e45ea1 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol @@ -0,0 +1,6 @@ +contract D {} +contract C { + function f() public view { new D(); } +} +// ---- +// TypeError: (58-65): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol new file mode 100644 index 00000000..d00f65c9 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol @@ -0,0 +1,18 @@ +contract C { + function f() pure public { + function () external nonpayFun; + nonpayFun(); + } + function g() pure public { + function () external view viewFun; + viewFun(); + } + function h() view public { + function () external nonpayFun; + nonpayFun(); + } +} +// ---- +// TypeError: (92-103): Function declared as pure, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. +// TypeError: (193-202): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". +// TypeError: (289-300): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol new file mode 100644 index 00000000..0ff1ac24 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol @@ -0,0 +1,15 @@ +contract C { + struct S { uint a; } + S s; + function f() pure public { + S storage x = s; + x; + } + function g() view public { + S storage x = s; + x.a = 1; + } +} +// ---- +// TypeError: (100-101): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". +// TypeError: (184-187): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol new file mode 100644 index 00000000..513850f7 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol @@ -0,0 +1,12 @@ +contract D { + uint x; + modifier viewm(uint) { uint a = x; _; a; } + modifier nonpayablem(uint) { x = 2; _; } +} +contract C is D { + function f() viewm(0) pure public {} + function g() nonpayablem(0) view public {} +} +// ---- +// TypeError: (154-162): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". +// TypeError: (195-209): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. diff --git a/test/libsolidity/syntaxTests/viewPureChecker/overriding.sol b/test/libsolidity/syntaxTests/viewPureChecker/overriding.sol deleted file mode 100644 index c82c7908..00000000 --- a/test/libsolidity/syntaxTests/viewPureChecker/overriding.sol +++ /dev/null @@ -1,7 +0,0 @@ -contract D { - uint x; - function f() public { x = 2; } -} -contract C is D { - function f() public {} -} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol new file mode 100644 index 00000000..61702495 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol @@ -0,0 +1,16 @@ +contract D { + uint x; + function f() public view { x; } + function g() public pure {} +} +contract C1 is D { + function f() public {} + function g() public view {} +} +contract C2 is D { + function g() public {} +} +// ---- +// TypeError: (118-140): Overriding function changes state mutability from "view" to "nonpayable". +// TypeError: (145-172): Overriding function changes state mutability from "pure" to "view". +// TypeError: (198-220): Overriding function changes state mutability from "pure" to "nonpayable". diff --git a/test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol new file mode 100644 index 00000000..c82c7908 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol @@ -0,0 +1,7 @@ +contract D { + uint x; + function f() public { x = 2; } +} +contract C is D { + function f() public {} +} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol new file mode 100644 index 00000000..785656b9 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol @@ -0,0 +1,8 @@ +contract C { + uint x; + function f() public pure returns (uint) { + return x; + } +} +// ---- +// TypeError: (86-87): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". diff --git a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol deleted file mode 100644 index 9b4eb466..00000000 --- a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol +++ /dev/null @@ -1,14 +0,0 @@ -contract C { - struct S { uint x; } - S s; - function f() view internal returns (S storage) { - return s; - } - function g() public { - f().x = 2; - } - function h() view public { - f(); - f().x; - } -} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol new file mode 100644 index 00000000..e04d0825 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol @@ -0,0 +1,13 @@ +contract C { + struct S { uint x; } + S s; + function f() pure internal returns (S storage) { + return s; + } + function g() pure public { + f().x; + } +} +// ---- +// TypeError: (115-116): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". +// TypeError: (163-168): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". diff --git a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol new file mode 100644 index 00000000..9b4eb466 --- /dev/null +++ b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol @@ -0,0 +1,14 @@ +contract C { + struct S { uint x; } + S s; + function f() view internal returns (S storage) { + return s; + } + function g() public { + f().x = 2; + } + function h() view public { + f(); + f().x; + } +} diff --git a/test/libsolidity/syntaxTests/viewPureChecker/selector.sol b/test/libsolidity/syntaxTests/viewPureChecker/selector.sol index 2ad4518d..c4e30075 100644 --- a/test/libsolidity/syntaxTests/viewPureChecker/selector.sol +++ b/test/libsolidity/syntaxTests/viewPureChecker/selector.sol @@ -5,4 +5,8 @@ contract C { function g() pure public returns (bytes4) { return this.f.selector ^ this.x.selector; } + function h() view public returns (bytes4) { + x; + return this.f.selector ^ this.x.selector; + } } -- cgit