diff options
author | chriseth <c@ethdev.com> | 2016-10-13 23:51:46 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2016-11-16 21:37:17 +0800 |
commit | 6f19559de02e0bf2b53e743678d53a4ea0414eae (patch) | |
tree | d1b3c7532e06b6a2aa93a4bf61b9cb7b250542bc | |
parent | 97a3588701edafe9112f35272b5d4c6e23e574b9 (diff) | |
download | dexon-solidity-6f19559de02e0bf2b53e743678d53a4ea0414eae.tar.gz dexon-solidity-6f19559de02e0bf2b53e743678d53a4ea0414eae.tar.zst dexon-solidity-6f19559de02e0bf2b53e743678d53a4ea0414eae.zip |
Fix some type checks and tests for internal / external function parameters.
-rw-r--r-- | libsolidity/ast/Types.cpp | 6 | ||||
-rw-r--r-- | test/libsolidity/SolidityEndToEndTest.cpp | 8 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 32 |
3 files changed, 35 insertions, 11 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 19a1b9d1..3afbee13 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -2075,12 +2075,12 @@ TypePointer FunctionType::encodingType() const return TypePointer(); } -TypePointer FunctionType::interfaceType(bool _inLibrary) const +TypePointer FunctionType::interfaceType(bool /*_inLibrary*/) const { if (m_location != Location::External && m_location != Location::Internal) return TypePointer(); - if (_inLibrary) - return shared_from_this(); + if (m_location != Location::External) + return TypePointer(); else return make_shared<IntegerType>(8 * storageBytes()); } 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) { } } )"; |