mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix some type checks and tests for internal / external function parameters.
This commit is contained in:
parent
97a3588701
commit
6f19559de0
@ -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());
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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) {
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
Loading…
Reference in New Issue
Block a user