From bd27ce0e25d298e075de6c77318e7a8df2e27f6d Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 16 Mar 2018 11:20:06 +0100 Subject: Extract function type tests. --- test/libsolidity/SolidityNameAndTypeResolution.cpp | 313 --------------------- .../call_value_on_non_payable_function_type.sol | 6 + .../call_value_on_payable_function_type.sol | 6 + .../delete_external_function_type_invalid.sol | 5 + .../functionTypes/delete_function_type.sol | 14 + .../functionTypes/delete_function_type_invalid.sol | 5 + ...unction_to_function_type_calldata_parameter.sol | 7 + .../external_function_type_returning_internal.sol | 3 + .../external_function_type_taking_internal.sol | 3 + .../external_function_type_to_address.sol | 5 + .../external_function_type_to_uint.sol | 5 + .../syntaxTests/functionTypes/function_type.sol | 5 + .../functionTypes/function_type_arrays.sol | 11 + .../functionTypes/function_type_parameter.sol | 5 + .../functionTypes/function_type_returned.sol | 5 + .../internal_function_as_external_parameter.sol | 4 + ...n_as_external_parameter_in_library_external.sol | 4 + ...n_as_external_parameter_in_library_internal.sol | 4 + ...rnal_function_returned_from_public_function.sol | 4 + .../internal_function_type_to_address.sol | 5 + .../payable_internal_function_type.sol | 3 + ...payable_internal_function_type_is_not_fatal.sol | 7 + .../functionTypes/private_function_type.sol | 5 + .../functionTypes/public_function_type.sol | 5 + .../warn_function_type_parameters_with_names.sol | 3 + ..._function_type_return_parameters_with_names.sol | 3 + 26 files changed, 132 insertions(+), 313 deletions(-) create mode 100644 test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/call_value_on_payable_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/private_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/public_function_type.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol (limited to 'test') diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 293f5f44..e5e5e246 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -5264,319 +5264,6 @@ BOOST_AUTO_TEST_CASE(using_directive_for_missing_selftype) CHECK_ERROR(text, TypeError, "Member \"b\" not found or not visible after argument-dependent lookup in bytes memory"); } -BOOST_AUTO_TEST_CASE(function_type) -{ - char const* text = R"( - contract C { - function f() public { - function(uint) returns (uint) x; - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(function_type_parameter) -{ - char const* text = R"( - contract C { - function f(function(uint) external returns (uint) g) public returns (function(uint) external returns (uint)) { - return g; - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(function_type_returned) -{ - char const* text = R"( - contract C { - function f() public returns (function(uint) external returns (uint) g) { - return g; - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(private_function_type) -{ - char const* text = R"( - contract C { - function f() public { - function(uint) private returns (uint) x; - } - } - )"; - CHECK_ERROR(text, TypeError, "Invalid visibility, can only be \"external\" or \"internal\"."); -} - -BOOST_AUTO_TEST_CASE(public_function_type) -{ - char const* text = R"( - contract C { - function f() public { - function(uint) public returns (uint) x; - } - } - )"; - CHECK_ERROR(text, TypeError, "Invalid visibility, can only be \"external\" or \"internal\"."); -} - -BOOST_AUTO_TEST_CASE(payable_internal_function_type) -{ - char const* text = R"( - contract C { - function (uint) internal payable returns (uint) x; - } - )"; - CHECK_ERROR(text, TypeError, "Only external function types can be payable."); -} - -BOOST_AUTO_TEST_CASE(payable_internal_function_type_is_not_fatal) -{ - char const* text = R"( - contract C { - function (uint) internal payable returns (uint) x; - - function g() { - x = g; - } - } - )"; - CHECK_ERROR_ALLOW_MULTI(text, TypeError, (std::vector{"Only external function types can be payable."})); -} - -BOOST_AUTO_TEST_CASE(call_value_on_non_payable_function_type) -{ - char const* text = R"( - contract C { - function (uint) external returns (uint) x; - function f() public { - x.value(2)(); - } - } - )"; - CHECK_ERROR(text, TypeError, "Member \"value\" not found or not visible after argument-dependent lookup in function (uint256) external returns (uint256) - did you forget the \"payable\" modifier?"); -} - -BOOST_AUTO_TEST_CASE(external_function_type_returning_internal) -{ - char const* text = R"( - contract C { - function() external returns (function () internal) x; - } - )"; - CHECK_ERROR(text, TypeError, "Internal type cannot be used for external function type."); -} - -BOOST_AUTO_TEST_CASE(external_function_type_taking_internal) -{ - char const* text = R"( - contract C { - function(function () internal) external x; - } - )"; - CHECK_ERROR(text, TypeError, "Internal type cannot be used for external function type."); -} - -BOOST_AUTO_TEST_CASE(call_value_on_payable_function_type) -{ - char const* text = R"( - contract C { - function (uint) external payable returns (uint) x; - function f() public { - x.value(2)(1); - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter) -{ - // It should not be possible to give internal functions - // as parameters to external functions. - char const* text = R"( - contract C { - function f(function(uint) internal returns (uint) x) public { - } - } - )"; - CHECK_ERROR(text, TypeError, "Internal or recursive type is not allowed for public or external functions."); -} - -BOOST_AUTO_TEST_CASE(internal_function_returned_from_public_function) -{ - // It should not be possible to return internal functions from external functions. - char const* text = R"( - contract C { - function f() public returns (function(uint) internal returns (uint) x) { - } - } - )"; - CHECK_ERROR(text, TypeError, "Internal or recursive type is not allowed for public or external functions."); -} - -BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter_in_library_internal) -{ - char const* text = R"( - library L { - function f(function(uint) internal returns (uint) x) internal { - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter_in_library_external) -{ - char const* text = R"( - library L { - function f(function(uint) internal returns (uint) x) public { - } - } - )"; - CHECK_ERROR(text, TypeError, "Internal or recursive type is not allowed for public or external functions."); -} - -BOOST_AUTO_TEST_CASE(function_type_arrays) -{ - char const* text = R"( - contract C { - function(uint) external returns (uint)[] public x; - function(uint) internal returns (uint)[10] y; - function f() public { - function(uint) returns (uint)[10] memory a; - function(uint) returns (uint)[10] storage b = y; - function(uint) external returns (uint)[] memory c; - c = new function(uint) external returns (uint)[](200); - a; b; - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(delete_function_type) -{ - char const* text = R"( - contract C { - function(uint) external returns (uint) x; - function(uint) internal returns (uint) y; - function f() public { - delete x; - var a = y; - delete a; - delete y; - var c = f; - delete c; - function(uint) internal returns (uint) g; - delete g; - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(delete_function_type_invalid) -{ - char const* text = R"( - contract C { - function f() public { - delete f; - } - } - )"; - CHECK_ERROR(text, TypeError, "Expression has to be an lvalue."); -} - -BOOST_AUTO_TEST_CASE(delete_external_function_type_invalid) -{ - char const* text = R"( - contract C { - function f() public { - delete this.f; - } - } - )"; - CHECK_ERROR(text, TypeError, "Expression has to be an lvalue."); -} - -BOOST_AUTO_TEST_CASE(external_function_to_function_type_calldata_parameter) -{ - // This is a test that checks that the type of the `bytes` parameter is - // correctly changed from its own type `bytes calldata` to `bytes memory` - // when converting to a function type. - char const* text = R"( - contract C { - function f(function(bytes memory) external g) public { } - function callback(bytes) external {} - function g() public { - f(this.callback); - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(external_function_type_to_address) -{ - char const* text = R"( - contract C { - function f() public returns (address) { - return address(this.f); - } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(internal_function_type_to_address) -{ - char const* text = R"( - contract C { - function f() public returns (address) { - return address(f); - } - } - )"; - CHECK_ERROR(text, TypeError, "Explicit type conversion not allowed"); -} - -BOOST_AUTO_TEST_CASE(external_function_type_to_uint) -{ - char const* text = R"( - contract C { - function f() public returns (uint) { - return uint(this.f); - } - } - )"; - CHECK_ERROR(text, TypeError, "Explicit type conversion not allowed"); -} - -BOOST_AUTO_TEST_CASE(warn_function_type_parameters_with_names) -{ - char const* text = R"( - contract C { - function(uint a) f; - } - )"; - CHECK_WARNING(text, "Naming function type parameters is deprecated."); -} - -BOOST_AUTO_TEST_CASE(warn_function_type_return_parameters_with_names) -{ - char const* text = R"( - contract C { - function(uint) returns (bool ret) f; - } - )"; - CHECK_WARNING(text, "Naming function type return parameters is deprecated."); -} - BOOST_AUTO_TEST_CASE(shift_constant_left_negative_rvalue) { char const* text = R"( diff --git a/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol new file mode 100644 index 00000000..dac7908f --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol @@ -0,0 +1,6 @@ +contract C { + function (uint) external returns (uint) x; + function f() public { + x.value(2)(); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/call_value_on_payable_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/call_value_on_payable_function_type.sol new file mode 100644 index 00000000..ca2a0196 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/call_value_on_payable_function_type.sol @@ -0,0 +1,6 @@ +contract C { + function (uint) external payable returns (uint) x; + function f() public { + x.value(2)(1); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol b/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol new file mode 100644 index 00000000..e3bf2dee --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol @@ -0,0 +1,5 @@ +contract C { + function f() public { + delete this.f; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol new file mode 100644 index 00000000..40c0c86f --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol @@ -0,0 +1,14 @@ +contract C { + function(uint) external returns (uint) x; + function(uint) internal returns (uint) y; + function f() public { + delete x; + var a = y; + delete a; + delete y; + var c = f; + delete c; + function(uint) internal returns (uint) g; + delete g; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol b/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol new file mode 100644 index 00000000..c2c77be0 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol @@ -0,0 +1,5 @@ +contract C { + function f() public { + delete f; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol new file mode 100644 index 00000000..cbf90e40 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol @@ -0,0 +1,7 @@ +contract C { + function f(function(bytes memory) external g) public { } + function callback(bytes) external {} + function g() public { + f(this.callback); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol new file mode 100644 index 00000000..c4f56b41 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol @@ -0,0 +1,3 @@ +contract C { + function() external returns (function () internal) x; +} diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol new file mode 100644 index 00000000..c3ba80a3 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol @@ -0,0 +1,3 @@ +contract C { + function(function () internal) external x; +} diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol new file mode 100644 index 00000000..5f4d4065 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol @@ -0,0 +1,5 @@ +contract C { + function f() public returns (address) { + return address(this.f); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol new file mode 100644 index 00000000..e47abefb --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol @@ -0,0 +1,5 @@ +contract C { + function f() public returns (uint) { + return uint(this.f); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type.sol b/test/libsolidity/syntaxTests/functionTypes/function_type.sol new file mode 100644 index 00000000..a879e351 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type.sol @@ -0,0 +1,5 @@ +contract C { + function f() public { + function(uint) returns (uint) x; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol new file mode 100644 index 00000000..c402dbff --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol @@ -0,0 +1,11 @@ +contract C { + function(uint) external returns (uint)[] public x; + function(uint) internal returns (uint)[10] y; + function f() public { + function(uint) returns (uint)[10] memory a; + function(uint) returns (uint)[10] storage b = y; + function(uint) external returns (uint)[] memory c; + c = new function(uint) external returns (uint)[](200); + a; b; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol new file mode 100644 index 00000000..c787e6f0 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol @@ -0,0 +1,5 @@ +contract C { + function f(function(uint) external returns (uint) g) public returns (function(uint) external returns (uint)) { + return g; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol new file mode 100644 index 00000000..0590fad4 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol @@ -0,0 +1,5 @@ +contract C { + function f() public returns (function(uint) external returns (uint) g) { + return g; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol new file mode 100644 index 00000000..3103001d --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol @@ -0,0 +1,4 @@ +contract C { + function f(function(uint) internal returns (uint) x) public { + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol new file mode 100644 index 00000000..7856d62d --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol @@ -0,0 +1,4 @@ +library L { + function f(function(uint) internal returns (uint) x) public { + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol new file mode 100644 index 00000000..13d6d03d --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol @@ -0,0 +1,4 @@ +library L { + function f(function(uint) internal returns (uint) x) internal { + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol new file mode 100644 index 00000000..e836a6cc --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol @@ -0,0 +1,4 @@ +contract C { + function f() public returns (function(uint) internal returns (uint) x) { + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol new file mode 100644 index 00000000..4a3f02c1 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol @@ -0,0 +1,5 @@ +contract C { + function f() public returns (address) { + return address(f); + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol new file mode 100644 index 00000000..69efaad4 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol @@ -0,0 +1,3 @@ +contract C { + function (uint) internal payable returns (uint) x; +} diff --git a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol new file mode 100644 index 00000000..fb84f9ca --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol @@ -0,0 +1,7 @@ +contract C { + function (uint) internal payable returns (uint) x; + + function g() { + x = g; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol new file mode 100644 index 00000000..d15430d2 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol @@ -0,0 +1,5 @@ +contract C { + function f() public { + function(uint) private returns (uint) x; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol new file mode 100644 index 00000000..ecc2493a --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol @@ -0,0 +1,5 @@ +contract C { + function f() public { + function(uint) public returns (uint) x; + } +} diff --git a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol new file mode 100644 index 00000000..44417f25 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol @@ -0,0 +1,3 @@ +contract C { + function(uint a) f; +} diff --git a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol new file mode 100644 index 00000000..f8c21fa8 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol @@ -0,0 +1,3 @@ +contract C { + function(uint) returns (bool ret) f; +} -- cgit v1.2.3 From 08e807aea01a443419dc82e159776899d96441ec Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 16 Mar 2018 11:33:05 +0100 Subject: Add expectations. --- .../functionTypes/call_value_on_non_payable_function_type.sol | 2 ++ .../functionTypes/delete_external_function_type_invalid.sol | 2 ++ .../syntaxTests/functionTypes/delete_function_type.sol | 3 +++ .../syntaxTests/functionTypes/delete_function_type_invalid.sol | 2 ++ .../external_function_to_function_type_calldata_parameter.sol | 9 ++++++--- .../functionTypes/external_function_type_returning_internal.sol | 2 ++ .../functionTypes/external_function_type_taking_internal.sol | 2 ++ .../functionTypes/external_function_type_to_address.sol | 2 +- .../syntaxTests/functionTypes/external_function_type_to_uint.sol | 2 ++ test/libsolidity/syntaxTests/functionTypes/function_type.sol | 3 ++- .../syntaxTests/functionTypes/function_type_arrays.sol | 2 +- .../syntaxTests/functionTypes/function_type_parameter.sol | 2 ++ .../syntaxTests/functionTypes/function_type_returned.sol | 2 +- .../functionTypes/internal_function_as_external_parameter.sol | 4 ++++ ...ternal_function_as_external_parameter_in_library_external.sol | 2 ++ ...ternal_function_as_external_parameter_in_library_internal.sol | 2 +- .../internal_function_returned_from_public_function.sol | 3 +++ .../functionTypes/internal_function_type_to_address.sol | 2 ++ .../syntaxTests/functionTypes/payable_internal_function_type.sol | 2 ++ .../payable_internal_function_type_is_not_fatal.sol | 4 +++- .../syntaxTests/functionTypes/private_function_type.sol | 2 ++ .../syntaxTests/functionTypes/public_function_type.sol | 2 ++ .../functionTypes/warn_function_type_parameters_with_names.sol | 2 ++ .../warn_function_type_return_parameters_with_names.sol | 2 ++ 24 files changed, 53 insertions(+), 9 deletions(-) (limited to 'test') diff --git a/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol index dac7908f..87c3b05b 100644 --- a/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/call_value_on_non_payable_function_type.sol @@ -4,3 +4,5 @@ contract C { x.value(2)(); } } +// ---- +// TypeError: (94-101): Member "value" not found or not visible after argument-dependent lookup in function (uint256) external returns (uint256) - did you forget the "payable" modifier? diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol b/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol index e3bf2dee..2711dae8 100644 --- a/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol +++ b/test/libsolidity/syntaxTests/functionTypes/delete_external_function_type_invalid.sol @@ -3,3 +3,5 @@ contract C { delete this.f; } } +// ---- +// TypeError: (54-60): Expression has to be an lvalue. diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol index 40c0c86f..a6fe6c22 100644 --- a/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/delete_function_type.sol @@ -12,3 +12,6 @@ contract C { delete g; } } +// ---- +// Warning: (157-162): Use of the "var" keyword is deprecated. +// Warning: (212-217): Use of the "var" keyword is deprecated. diff --git a/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol b/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol index c2c77be0..60da19e4 100644 --- a/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol +++ b/test/libsolidity/syntaxTests/functionTypes/delete_function_type_invalid.sol @@ -3,3 +3,5 @@ contract C { delete f; } } +// ---- +// TypeError: (54-55): Expression has to be an lvalue. diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol index cbf90e40..eb4f0693 100644 --- a/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol @@ -1,7 +1,10 @@ +// This is a test that checks that the type of the `bytes` parameter is +// correctly changed from its own type `bytes calldata` to `bytes memory` +// when converting to a function type. contract C { - function f(function(bytes memory) external g) public { } - function callback(bytes) external {} - function g() public { + function f(function(bytes memory) pure external /*g*/) pure public { } + function callback(bytes) pure external {} + function g() view public { f(this.callback); } } diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol index c4f56b41..8b14d3dc 100644 --- a/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_returning_internal.sol @@ -1,3 +1,5 @@ contract C { function() external returns (function () internal) x; } +// ---- +// TypeError: (46-67): Internal type cannot be used for external function type. diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol index c3ba80a3..3e264c8c 100644 --- a/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_taking_internal.sol @@ -1,3 +1,5 @@ contract C { function(function () internal) external x; } +// ---- +// TypeError: (26-47): Internal type cannot be used for external function type. diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol index 5f4d4065..b86425db 100644 --- a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_address.sol @@ -1,5 +1,5 @@ contract C { - function f() public returns (address) { + function f() public view returns (address) { return address(this.f); } } diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol index e47abefb..f4287223 100644 --- a/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_to_uint.sol @@ -3,3 +3,5 @@ contract C { return uint(this.f); } } +// ---- +// TypeError: (69-81): Explicit type conversion not allowed from "function () external returns (uint256)" to "uint256". diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type.sol b/test/libsolidity/syntaxTests/functionTypes/function_type.sol index a879e351..23d50136 100644 --- a/test/libsolidity/syntaxTests/functionTypes/function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/function_type.sol @@ -1,5 +1,6 @@ contract C { - function f() public { + function f() pure public { function(uint) returns (uint) x; + x; } } diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol index c402dbff..ec23d637 100644 --- a/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_arrays.sol @@ -1,7 +1,7 @@ contract C { function(uint) external returns (uint)[] public x; function(uint) internal returns (uint)[10] y; - function f() public { + function f() view public { function(uint) returns (uint)[10] memory a; function(uint) returns (uint)[10] storage b = y; function(uint) external returns (uint)[] memory c; diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol index c787e6f0..da66ec8a 100644 --- a/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_parameter.sol @@ -1,5 +1,7 @@ contract C { + uint x; function f(function(uint) external returns (uint) g) public returns (function(uint) external returns (uint)) { + x = 2; return g; } } diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol index 0590fad4..9cd313c8 100644 --- a/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_returned.sol @@ -1,5 +1,5 @@ contract C { - function f() public returns (function(uint) external returns (uint) g) { + function f() public pure returns (function(uint) pure external returns (uint) g) { return g; } } diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol index 3103001d..fa92d559 100644 --- a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter.sol @@ -1,4 +1,8 @@ +// It should not be possible to give internal functions +// as parameters to external functions. contract C { function f(function(uint) internal returns (uint) x) public { } } +// ---- +// TypeError: (124-164): Internal or recursive type is not allowed for public or external functions. diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol index 7856d62d..b37fb285 100644 --- a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_external.sol @@ -2,3 +2,5 @@ library L { function f(function(uint) internal returns (uint) x) public { } } +// ---- +// TypeError: (27-67): Internal or recursive type is not allowed for public or external functions. diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol index 13d6d03d..7ffa447e 100644 --- a/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_as_external_parameter_in_library_internal.sol @@ -1,4 +1,4 @@ library L { - function f(function(uint) internal returns (uint) x) internal { + function f(function(uint) internal returns (uint) /*x*/) pure internal { } } diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol index e836a6cc..41fcd0a4 100644 --- a/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_returned_from_public_function.sol @@ -1,4 +1,7 @@ +// It should not be possible to return internal functions from external functions. contract C { function f() public returns (function(uint) internal returns (uint) x) { } } +// ---- +// TypeError: (129-169): Internal or recursive type is not allowed for public or external functions. diff --git a/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol b/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol index 4a3f02c1..b75a0d43 100644 --- a/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol +++ b/test/libsolidity/syntaxTests/functionTypes/internal_function_type_to_address.sol @@ -3,3 +3,5 @@ contract C { return address(f); } } +// ---- +// TypeError: (72-82): Explicit type conversion not allowed from "function () returns (address)" to "address". diff --git a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol index 69efaad4..a7cb9d92 100644 --- a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type.sol @@ -1,3 +1,5 @@ contract C { function (uint) internal payable returns (uint) x; } +// ---- +// TypeError: (17-66): Only external function types can be payable. diff --git a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol index fb84f9ca..5c6dc056 100644 --- a/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol +++ b/test/libsolidity/syntaxTests/functionTypes/payable_internal_function_type_is_not_fatal.sol @@ -1,7 +1,9 @@ contract C { function (uint) internal payable returns (uint) x; - function g() { + function g() public { x = g; } } +// ---- +// TypeError: (17-66): Only external function types can be payable. diff --git a/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol index d15430d2..9d4f0a09 100644 --- a/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/private_function_type.sol @@ -3,3 +3,5 @@ contract C { function(uint) private returns (uint) x; } } +// ---- +// TypeError: (47-86): Invalid visibility, can only be "external" or "internal". diff --git a/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol b/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol index ecc2493a..756766d3 100644 --- a/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol +++ b/test/libsolidity/syntaxTests/functionTypes/public_function_type.sol @@ -3,3 +3,5 @@ contract C { function(uint) public returns (uint) x; } } +// ---- +// TypeError: (47-85): Invalid visibility, can only be "external" or "internal". diff --git a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol index 44417f25..072c7eb7 100644 --- a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol +++ b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_parameters_with_names.sol @@ -1,3 +1,5 @@ contract C { function(uint a) f; } +// ---- +// Warning: (26-32): Naming function type parameters is deprecated. diff --git a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol index f8c21fa8..67a74e54 100644 --- a/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol +++ b/test/libsolidity/syntaxTests/functionTypes/warn_function_type_return_parameters_with_names.sol @@ -1,3 +1,5 @@ contract C { function(uint) returns (bool ret) f; } +// ---- +// Warning: (41-49): Naming function type return parameters is deprecated. -- cgit v1.2.3 From 42b90ad4c3fc33c2cb1cafb7370b8d10c5fbc957 Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 16 Mar 2018 11:45:18 +0100 Subject: New tests for function state variables. --- .../external_function_type_public_variable.sol | 11 +++++++++++ .../function_type_internal_public_variable.sol | 5 +++++ .../function_type_variable_external_internal.sol | 6 ++++++ .../function_types_internal_visibility_error.sol | 7 +++++++ .../function_types_variable_visibility.sol | 9 +++++++++ .../valid_function_type_variables.sol | 23 ++++++++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 test/libsolidity/syntaxTests/functionTypes/external_function_type_public_variable.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_internal_public_variable.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_types_internal_visibility_error.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_types_variable_visibility.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol (limited to 'test') diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_type_public_variable.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_type_public_variable.sol new file mode 100644 index 00000000..0a6d1e53 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/external_function_type_public_variable.sol @@ -0,0 +1,11 @@ +contract C { + function (uint) external public x; + + function g(uint) public { + x = this.g; + } + function f() public view returns (function(uint) external) { + return this.x(); + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_internal_public_variable.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_internal_public_variable.sol new file mode 100644 index 00000000..4eb53227 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_internal_public_variable.sol @@ -0,0 +1,5 @@ +contract C { + function(bytes memory) internal public a; +} +// ---- +// TypeError: (17-57): Internal or recursive type is not allowed for public state variables. diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol new file mode 100644 index 00000000..b42f6908 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol @@ -0,0 +1,6 @@ +contract test { + function fa(bytes memory) { } + function(bytes memory) external internal a = fa; +} +// ---- +// TypeError: (99-101): Type function (bytes memory) is not implicitly convertible to expected type function (bytes memory) external. diff --git a/test/libsolidity/syntaxTests/functionTypes/function_types_internal_visibility_error.sol b/test/libsolidity/syntaxTests/functionTypes/function_types_internal_visibility_error.sol new file mode 100644 index 00000000..36206d63 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_types_internal_visibility_error.sol @@ -0,0 +1,7 @@ +contract C { + // This is an error, you should explicitly use + // `external public` to fix it - `internal public` does not exist. + function(bytes memory) public a; +} +// ---- +// TypeError: (139-170): Invalid visibility, can only be "external" or "internal". diff --git a/test/libsolidity/syntaxTests/functionTypes/function_types_variable_visibility.sol b/test/libsolidity/syntaxTests/functionTypes/function_types_variable_visibility.sol new file mode 100644 index 00000000..91c2420a --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_types_variable_visibility.sol @@ -0,0 +1,9 @@ +contract C { + function(bytes memory) a1; + function(bytes memory) internal b1; + function(bytes memory) internal internal b2; + function(bytes memory) external c1; + function(bytes memory) external internal c2; + function(bytes memory) external public c3; +} +// ---- diff --git a/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol b/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol new file mode 100644 index 00000000..10c6767c --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol @@ -0,0 +1,23 @@ +contract test { + function fa(uint) {} + function fb(uint) internal {} + function fc(uint) internal {} + function fd(uint) external {} + function fe(uint) external {} + function ff(uint) internal {} + function fg(uint) internal pure {} + function fh(uint) pure internal {} + + function(uint) a = fa; + function(uint) internal b = fb; // (explicit internal applies to the function type) + function(uint) internal internal c = fc; + function(uint) external d = this.fd; + function(uint) external internal e = this.fe; + function(uint) internal public f = ff; + function(uint) internal pure public g = fg; + function(uint) pure internal public h = fh; +} +// ---- +// TypeError: (545-582): Internal or recursive type is not allowed for public state variables. +// TypeError: (588-630): Internal or recursive type is not allowed for public state variables. +// TypeError: (636-678): Internal or recursive type is not allowed for public state variables. -- cgit v1.2.3 From 2ad1acaf721072d27783d586048d6377be6c3f99 Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 16 Mar 2018 12:39:30 +0100 Subject: Warn if modifiers are applied to functions without implementation. --- .../modifiers/modifiers_on_abstract_functions_050.sol | 10 ++++++++++ .../modifiers_on_abstract_functions_no_parser_error.sol | 13 +++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_050.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_no_parser_error.sol (limited to 'test') diff --git a/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_050.sol b/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_050.sol new file mode 100644 index 00000000..af1babbc --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_050.sol @@ -0,0 +1,10 @@ +pragma experimental "v0.5.0"; +contract C +{ + modifier only_owner() { _; } + function foo() only_owner public; + function bar() public only_owner; +} +// ---- +// SyntaxError: (80-113): Functions without implementation cannot have modifiers. +// SyntaxError: (118-151): Functions without implementation cannot have modifiers. diff --git a/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_no_parser_error.sol b/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_no_parser_error.sol new file mode 100644 index 00000000..e18c5cf9 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/modifiers_on_abstract_functions_no_parser_error.sol @@ -0,0 +1,13 @@ +// Previous versions of Solidity turned this +// into a parser error (they wrongly recognized +// these functions as state variables of +// function type). +contract C +{ + modifier only_owner() { _; } + function foo() only_owner public; + function bar() public only_owner; +} +// ---- +// Warning: (203-236): Modifiers of functions without implementation are ignored. +// Warning: (241-274): Modifiers of functions without implementation are ignored. -- cgit v1.2.3 From 4e1ea0866d889daa1144d7c4d89b16cd03cf7dc2 Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 16 Mar 2018 12:45:12 +0100 Subject: Extract modifier tests. --- test/libsolidity/SolidityNameAndTypeResolution.cpp | 158 --------------------- .../base_constructor_double_invocation.sol | 6 + .../constructor_call_invalid_arg_count.sol | 9 ++ .../function_modifier_double_invocation.sol | 4 + .../modifiers/function_modifier_invocation.sol | 5 + ...unction_modifier_invocation_local_variables.sol | 4 + ...tion_modifier_invocation_local_variables050.sol | 7 + .../function_modifier_invocation_parameters.sol | 5 + .../modifiers/function_overrides_modifier.sol | 5 + .../modifiers/illegal_modifier_override.sol | 4 + .../modifiers/invalid_function_modifier_type.sol | 6 + .../modifiers/legal_modifier_override.sol | 2 + .../modifiers/modifier_overrides_function.sol | 5 + .../modifiers/modifier_returns_value.sol | 6 + .../modifiers/modifier_without_underscore.sol | 5 + 15 files changed, 73 insertions(+), 158 deletions(-) create mode 100644 test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_modifier_double_invocation.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_modifier_invocation.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_parameters.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/legal_modifier_override.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol (limited to 'test') diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index e5e5e246..18a414e0 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -975,139 +975,6 @@ BOOST_AUTO_TEST_CASE(super_excludes_current_contract) CHECK_ERROR(text, TypeError, "Member \"f\" not found or not visible after argument-dependent lookup in contract super B"); } -BOOST_AUTO_TEST_CASE(function_modifier_invocation) -{ - char const* text = R"( - contract B { - function f() mod1(2, true) mod2("0123456") pure public { } - modifier mod1(uint a, bool b) { if (b) _; } - modifier mod2(bytes7 a) { while (a == "1234567") _; } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(invalid_function_modifier_type) -{ - char const* text = R"( - contract B { - function f() mod1(true) public { } - modifier mod1(uint a) { if (a > 0) _; } - } - )"; - CHECK_ERROR(text, TypeError, "Invalid type for argument in modifier invocation. Invalid implicit conversion from bool to uint256 requested."); -} - -BOOST_AUTO_TEST_CASE(function_modifier_invocation_parameters) -{ - char const* text = R"( - contract B { - function f(uint8 a) mod1(a, true) mod2(r) public returns (bytes7 r) { } - modifier mod1(uint a, bool b) { if (b) _; } - modifier mod2(bytes7 a) { while (a == "1234567") _; } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(function_modifier_invocation_local_variables) -{ - char const* text = R"( - contract B { - function f() mod(x) pure public { uint x = 7; } - modifier mod(uint a) { if (a > 0) _; } - } - )"; - CHECK_SUCCESS_NO_WARNINGS(text); -} - -BOOST_AUTO_TEST_CASE(function_modifier_invocation_local_variables050) -{ - char const* text = R"( - pragma experimental "v0.5.0"; - contract B { - function f() mod(x) pure public { uint x = 7; } - modifier mod(uint a) { if (a > 0) _; } - } - )"; - CHECK_ERROR(text, DeclarationError, "Undeclared identifier."); -} - -BOOST_AUTO_TEST_CASE(function_modifier_double_invocation) -{ - char const* text = R"( - contract B { - function f(uint x) mod(x) mod(2) public { } - modifier mod(uint a) { if (a > 0) _; } - } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(base_constructor_double_invocation) -{ - char const* text = R"( - contract C { function C(uint a) public {} } - contract B is C { - function B() C(2) C(2) public {} - } - )"; - CHECK_ERROR(text, DeclarationError, "Base constructor already provided"); -} - -BOOST_AUTO_TEST_CASE(legal_modifier_override) -{ - char const* text = R"( - contract A { modifier mod(uint a) { _; } } - contract B is A { modifier mod(uint a) { _; } } - )"; - CHECK_SUCCESS(text); -} - -BOOST_AUTO_TEST_CASE(illegal_modifier_override) -{ - char const* text = R"( - contract A { modifier mod(uint a) { _; } } - contract B is A { modifier mod(uint8 a) { _; } } - )"; - CHECK_ERROR(text, TypeError, "Override changes modifier signature."); -} - -BOOST_AUTO_TEST_CASE(modifier_overrides_function) -{ - char const* text = R"( - contract A { modifier mod(uint a) { _; } } - contract B is A { function mod(uint a) public { } } - )"; - CHECK_ALLOW_MULTI(text, (vector>{ - {Error::Type::DeclarationError, "Identifier already declared"}, - {Error::Type::TypeError, "Override changes modifier to function"} - })); -} - -BOOST_AUTO_TEST_CASE(function_overrides_modifier) -{ - char const* text = R"( - contract A { function mod(uint a) public { } } - contract B is A { modifier mod(uint a) { _; } } - )"; - CHECK_ALLOW_MULTI(text, (vector>{ - {Error::Type::DeclarationError, "Identifier already declared"}, - {Error::Type::TypeError, "Override changes function to modifier"} - })); -} - -BOOST_AUTO_TEST_CASE(modifier_returns_value) -{ - char const* text = R"( - contract A { - function f(uint a) mod(2) public returns (uint r) { } - modifier mod(uint a) { _; return 7; } - } - )"; - CHECK_ERROR(text, TypeError, "Return arguments not allowed."); -} - BOOST_AUTO_TEST_CASE(state_variable_accessors) { char const* text = R"( @@ -4176,21 +4043,6 @@ BOOST_AUTO_TEST_CASE(conditional_with_all_types) CHECK_SUCCESS(text); } -BOOST_AUTO_TEST_CASE(constructor_call_invalid_arg_count) -{ - // This caused a segfault in an earlier version - char const* text = R"( - contract C { - function C(){} - } - contract D is C { - function D() C(5){} - } - )"; - - CHECK_ERROR(text, TypeError, "Wrong argument count for modifier invocation: 1 arguments given but expected 0."); -} - BOOST_AUTO_TEST_CASE(index_access_for_bytes) { char const* text = R"( @@ -5055,16 +4907,6 @@ BOOST_AUTO_TEST_CASE(no_warn_about_callcode_as_function) CHECK_SUCCESS_NO_WARNINGS(text); } -BOOST_AUTO_TEST_CASE(modifier_without_underscore) -{ - char const* text = R"( - contract test { - modifier m() {} - } - )"; - CHECK_ERROR(text, SyntaxError, "Modifier body does not contain '_'."); -} - BOOST_AUTO_TEST_CASE(payable_in_library) { char const* text = R"( diff --git a/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol b/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol new file mode 100644 index 00000000..a2a82521 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol @@ -0,0 +1,6 @@ +contract C { function C(uint a) public {} } +contract B is C { + function B() C(2) C(2) public {} +} +// ---- +// DeclarationError: Base constructor already provided. diff --git a/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol b/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol new file mode 100644 index 00000000..fac9b319 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol @@ -0,0 +1,9 @@ +// This caused a segfault in an earlier version +contract C { + function C() public {} +} +contract D is C { + function D() C(5) public {} +} +// ---- +// TypeError: Wrong argument count for modifier invocation: 1 arguments given but expected 0. diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_double_invocation.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_double_invocation.sol new file mode 100644 index 00000000..75624192 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_double_invocation.sol @@ -0,0 +1,4 @@ +contract B { + function f(uint x) mod(x) mod(2) public pure { } + modifier mod(uint a) { if (a > 0) _; } +} diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation.sol new file mode 100644 index 00000000..e15fcf49 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation.sol @@ -0,0 +1,5 @@ +contract B { + function f() mod1(2, true) mod2("0123456") pure public { } + modifier mod1(uint a, bool b) { if (b) _; } + modifier mod2(bytes7 a) { while (a == "1234567") _; } +} diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables.sol new file mode 100644 index 00000000..00031924 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables.sol @@ -0,0 +1,4 @@ +contract B { + function f() mod(x) pure public { uint x = 7; } + modifier mod(uint a) { if (a > 0) _; } +} diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol new file mode 100644 index 00000000..52439f2b --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol @@ -0,0 +1,7 @@ +pragma experimental "v0.5.0"; +contract B { + function f() mod(x) pure public { uint x = 7; } + modifier mod(uint a) { if (a > 0) _; } +} +// ---- +// DeclarationError: Undeclared identifier. diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_parameters.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_parameters.sol new file mode 100644 index 00000000..de2a8f48 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_parameters.sol @@ -0,0 +1,5 @@ +contract B { + function f(uint8 a) mod1(a, true) mod2(r) pure public returns (bytes7 r) { } + modifier mod1(uint a, bool b) { if (b) _; } + modifier mod2(bytes7 a) { while (a == "1234567") _; } +} diff --git a/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol b/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol new file mode 100644 index 00000000..25485bec --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol @@ -0,0 +1,5 @@ +contract A { function mod(uint a) public { } } +contract B is A { modifier mod(uint a) { _; } } +// ---- +// DeclarationError: Identifier already declared. +// TypeError: Override changes function to modifier. diff --git a/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol b/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol new file mode 100644 index 00000000..f77a529b --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol @@ -0,0 +1,4 @@ +contract A { modifier mod(uint a) { _; } } +contract B is A { modifier mod(uint8 a) { _; } } +// ---- +// TypeError: Override changes modifier signature. diff --git a/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol b/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol new file mode 100644 index 00000000..8d7d1f9f --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol @@ -0,0 +1,6 @@ +contract B { + function f() mod1(true) public { } + modifier mod1(uint a) { if (a > 0) _; } +} +// ---- +// TypeError: Invalid type for argument in modifier invocation. Invalid implicit conversion from bool to uint256 requested. diff --git a/test/libsolidity/syntaxTests/modifiers/legal_modifier_override.sol b/test/libsolidity/syntaxTests/modifiers/legal_modifier_override.sol new file mode 100644 index 00000000..51c3fd80 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/legal_modifier_override.sol @@ -0,0 +1,2 @@ +contract A { modifier mod(uint a) { _; } } +contract B is A { modifier mod(uint a) { _; } } diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol b/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol new file mode 100644 index 00000000..ebf36a0d --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol @@ -0,0 +1,5 @@ +contract A { modifier mod(uint a) { _; } } +contract B is A { function mod(uint a) public { } } +// ---- +// DeclarationError: Identifier already declared. +// TypeError: Override changes modifier to function. diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol b/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol new file mode 100644 index 00000000..0ae00b66 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol @@ -0,0 +1,6 @@ +contract A { + function f(uint a) mod(2) public returns (uint r) { } + modifier mod(uint a) { _; return 7; } +} +// ---- +// TypeError: Return arguments not allowed. diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol b/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol new file mode 100644 index 00000000..ae44c4c7 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol @@ -0,0 +1,5 @@ +contract test { + modifier m() {} +} +// ---- +// SyntaxError: Modifier body does not contain '_'. -- cgit v1.2.3 From 52f68d3b63d65c31215e683899b96b27e2e24ee1 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 11 Apr 2018 17:58:53 +0200 Subject: Update expectations. --- .../functionTypes/function_type_variable_external_internal.sol | 4 ++-- .../syntaxTests/modifiers/base_constructor_double_invocation.sol | 7 ++++--- .../syntaxTests/modifiers/constructor_call_invalid_arg_count.sol | 6 +++--- .../modifiers/function_modifier_invocation_local_variables050.sol | 2 +- .../syntaxTests/modifiers/function_overrides_modifier.sol | 4 ++-- .../syntaxTests/modifiers/illegal_modifier_override.sol | 2 +- .../syntaxTests/modifiers/invalid_function_modifier_type.sol | 2 +- .../syntaxTests/modifiers/modifier_overrides_function.sol | 4 ++-- test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol | 2 +- .../syntaxTests/modifiers/modifier_without_underscore.sol | 2 +- 10 files changed, 18 insertions(+), 17 deletions(-) (limited to 'test') diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol index b42f6908..f0240472 100644 --- a/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_variable_external_internal.sol @@ -1,6 +1,6 @@ contract test { - function fa(bytes memory) { } + function fa(bytes memory) public { } function(bytes memory) external internal a = fa; } // ---- -// TypeError: (99-101): Type function (bytes memory) is not implicitly convertible to expected type function (bytes memory) external. +// TypeError: (106-108): Type function (bytes memory) is not implicitly convertible to expected type function (bytes memory) external. diff --git a/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol b/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol index a2a82521..bdbab5d8 100644 --- a/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol +++ b/test/libsolidity/syntaxTests/modifiers/base_constructor_double_invocation.sol @@ -1,6 +1,7 @@ -contract C { function C(uint a) public {} } +contract C { constructor(uint a) public {} } contract B is C { - function B() C(2) C(2) public {} + constructor() C(2) C(2) public {} } // ---- -// DeclarationError: Base constructor already provided. +// Warning: (81-85): Base constructor arguments given twice. +// DeclarationError: (86-90): Base constructor already provided. diff --git a/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol b/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol index fac9b319..4a2b5c4a 100644 --- a/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol +++ b/test/libsolidity/syntaxTests/modifiers/constructor_call_invalid_arg_count.sol @@ -1,9 +1,9 @@ // This caused a segfault in an earlier version contract C { - function C() public {} + constructor() public {} } contract D is C { - function D() C(5) public {} + constructor() C(5) public {} } // ---- -// TypeError: Wrong argument count for modifier invocation: 1 arguments given but expected 0. +// TypeError: (127-131): Wrong argument count for modifier invocation: 1 arguments given but expected 0. diff --git a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol index 52439f2b..c19ccf2c 100644 --- a/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol +++ b/test/libsolidity/syntaxTests/modifiers/function_modifier_invocation_local_variables050.sol @@ -4,4 +4,4 @@ contract B { modifier mod(uint a) { if (a > 0) _; } } // ---- -// DeclarationError: Undeclared identifier. +// DeclarationError: (64-65): Undeclared identifier. diff --git a/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol b/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol index 25485bec..a64c2790 100644 --- a/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol +++ b/test/libsolidity/syntaxTests/modifiers/function_overrides_modifier.sol @@ -1,5 +1,5 @@ contract A { function mod(uint a) public { } } contract B is A { modifier mod(uint a) { _; } } // ---- -// DeclarationError: Identifier already declared. -// TypeError: Override changes function to modifier. +// DeclarationError: (65-92): Identifier already declared. +// TypeError: (65-92): Override changes function to modifier. diff --git a/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol b/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol index f77a529b..958be686 100644 --- a/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol +++ b/test/libsolidity/syntaxTests/modifiers/illegal_modifier_override.sol @@ -1,4 +1,4 @@ contract A { modifier mod(uint a) { _; } } contract B is A { modifier mod(uint8 a) { _; } } // ---- -// TypeError: Override changes modifier signature. +// TypeError: (61-89): Override changes modifier signature. diff --git a/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol b/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol index 8d7d1f9f..c1e3108b 100644 --- a/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol +++ b/test/libsolidity/syntaxTests/modifiers/invalid_function_modifier_type.sol @@ -3,4 +3,4 @@ contract B { modifier mod1(uint a) { if (a > 0) _; } } // ---- -// TypeError: Invalid type for argument in modifier invocation. Invalid implicit conversion from bool to uint256 requested. +// TypeError: (35-39): Invalid type for argument in modifier invocation. Invalid implicit conversion from bool to uint256 requested. diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol b/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol index ebf36a0d..a43646c3 100644 --- a/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol +++ b/test/libsolidity/syntaxTests/modifiers/modifier_overrides_function.sol @@ -1,5 +1,5 @@ contract A { modifier mod(uint a) { _; } } contract B is A { function mod(uint a) public { } } // ---- -// DeclarationError: Identifier already declared. -// TypeError: Override changes modifier to function. +// DeclarationError: (61-92): Identifier already declared. +// TypeError: (13-40): Override changes modifier to function. diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol b/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol index 0ae00b66..d22e836c 100644 --- a/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol +++ b/test/libsolidity/syntaxTests/modifiers/modifier_returns_value.sol @@ -3,4 +3,4 @@ contract A { modifier mod(uint a) { _; return 7; } } // ---- -// TypeError: Return arguments not allowed. +// TypeError: (101-109): Return arguments not allowed. diff --git a/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol b/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol index ae44c4c7..6198d3c5 100644 --- a/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol +++ b/test/libsolidity/syntaxTests/modifiers/modifier_without_underscore.sol @@ -2,4 +2,4 @@ contract test { modifier m() {} } // ---- -// SyntaxError: Modifier body does not contain '_'. +// SyntaxError: (33-35): Modifier body does not contain '_'. -- cgit v1.2.3 From b5a696ad48780bf0614eef2a737a2e89963d4640 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 11 Apr 2018 17:44:44 +0200 Subject: Properly cope with constructor headers. --- .../syntaxTests/functionTypes/function_type_constructor.sol | 7 +++++++ .../syntaxTests/functionTypes/function_type_constructor_local.sol | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/function_type_constructor_local.sol (limited to 'test') diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol new file mode 100644 index 00000000..95ebc179 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol @@ -0,0 +1,7 @@ +contract C { + // Fool parser into parsing a constructor as a function type. + constructor() x; +} +// ---- +// Warning: (83-99): Modifiers of functions without implementation are ignored. +// DeclarationError: (97-98): Undeclared identifier. diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_constructor_local.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor_local.sol new file mode 100644 index 00000000..b7763d28 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor_local.sol @@ -0,0 +1,8 @@ +contract C { + // Fool parser into parsing a constructor as a function type. + function f() { + constructor() x; + } +} +// ---- +// ParserError: (118-118): Expected token Semicolon got 'Identifier' -- cgit v1.2.3