diff options
Diffstat (limited to 'test/libsolidity')
-rw-r--r-- | test/libsolidity/SolidityEndToEndTest.cpp | 8 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 32 |
2 files changed, 32 insertions, 8 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 0f392cab..709e63b2 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -7612,12 +7612,12 @@ BOOST_AUTO_TEST_CASE(calling_uninitialized_function) contract C { function intern() returns (uint) { function (uint) internal returns (uint) x; - x(); + x(2); return 7; } function extern() returns (uint) { function (uint) external returns (uint) x; - x(); + x(2); return 7; } } @@ -7676,7 +7676,7 @@ BOOST_AUTO_TEST_CASE(store_function) function addTwo(uint x) returns (uint) { return x + 2; } } contract C { - function (unction (uint) external returns (uint)) returns (uint) ev = eval; + function (function (uint) external returns (uint)) returns (uint) ev = eval; function (uint) external returns (uint) x; function store(function(uint) external returns (uint) y) { x = y; @@ -7695,7 +7695,7 @@ BOOST_AUTO_TEST_CASE(store_function) BOOST_CHECK(callContractFunction("t()") == encodeArgs(u256(9))); } -// TODO: public function state variables, arrays +// TODO: arrays, libraries BOOST_AUTO_TEST_CASE(shift_constant_left) { diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 2d469cdc..8b8c3aeb 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -4148,7 +4148,19 @@ BOOST_AUTO_TEST_CASE(function_type_parameter) { char const* text = R"( contract C { - function f(function(uint) returns (uint) g) returns (function(uint) returns (uint)) { + function f(function(uint) external returns (uint) g) returns (function(uint) external returns (uint)) { + return g; + } + } + )"; + BOOST_CHECK(success(text)); +} + +BOOST_AUTO_TEST_CASE(function_type_returned) +{ + char const* text = R"( + contract C { + function f() returns (function(uint) external returns (uint) g) { return g; } } @@ -4186,7 +4198,19 @@ BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter) // as parameters to external functions. char const* text = R"( contract C { - function f(function(uint) returns (uint) x) { + function f(function(uint) internal returns (uint) x) { + } + } + )"; + BOOST_CHECK(expectError(text) == Error::Type::TypeError); +} + +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() returns (function(uint) internal returns (uint) x) { } } )"; @@ -4197,7 +4221,7 @@ BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter_in_library_internal { char const* text = R"( library L { - function f(function(uint) returns (uint) x) internal { + function f(function(uint) internal returns (uint) x) internal { } } )"; @@ -4207,7 +4231,7 @@ BOOST_AUTO_TEST_CASE(internal_function_as_external_parameter_in_library_external { char const* text = R"( library L { - function f(function(uint) returns (uint) x) { + function f(function(uint) internal returns (uint) x) { } } )"; |