aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-10-13 23:51:46 +0800
committerchriseth <c@ethdev.com>2016-11-16 21:37:17 +0800
commit6f19559de02e0bf2b53e743678d53a4ea0414eae (patch)
treed1b3c7532e06b6a2aa93a4bf61b9cb7b250542bc
parent97a3588701edafe9112f35272b5d4c6e23e574b9 (diff)
downloaddexon-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.cpp6
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp8
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp32
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) {
}
}
)";