diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index b1529f8f8..79dfd90ed 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -7721,6 +7721,36 @@ BOOST_AUTO_TEST_CASE(function_type_library_internal) } +BOOST_AUTO_TEST_CASE(call_function_returning_function) +{ + char const* sourceCode = R"( + contract test { + function f0() returns (uint) { + return 2; + } + function f1() returns (function() returns (uint)) { + returns f0; + } + function f2() returns (function() returns (function () returns (uint))) { + returns f1; + } + function f3() returns (function() returns (function () returns (function () returns (uint)))) + { + returns f2; + } + function f() returns (uint) { + function() returns(function() returns(function() returns(function() returns(uint)))) x; + x = f3; + return x()()()(); + } + } + )"; + + compileAndRun(sourceCode, 0, "C"); + BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2))); +} + + // TODO: arrays, libraries with external functions BOOST_AUTO_TEST_CASE(shift_constant_left) diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp index 496f47031..d8c6fa107 100644 --- a/test/libsolidity/SolidityParser.cpp +++ b/test/libsolidity/SolidityParser.cpp @@ -1311,6 +1311,21 @@ BOOST_AUTO_TEST_CASE(function_type_as_parameter) BOOST_CHECK(successParse(text)); } +BOOST_AUTO_TEST_CASE(calling_function) +{ + char const* text = R"( + contract test { + function f() { + function() returns(function() returns(function() returns(function() returns(uint)))) x; + uint y; + y = x()()()(); + } + } + )"; + BOOST_CHECK(successParse(text)); +} + + BOOST_AUTO_TEST_SUITE_END() }