Treat invalid external function type as a fatal error to prevent the type from being used

- `returnParameterTypesWithoutDynamicTypes()` assumes it won't encounter such types.
This commit is contained in:
Kamil Śliwak 2021-06-02 21:38:57 +02:00
parent 4cbf9ff74c
commit 4a19c7e495
4 changed files with 19 additions and 1 deletions

View File

@ -23,6 +23,7 @@ Bugfixes:
* Source Locations: Properly set source location of scoped blocks.
* Standard JSON: Properly allow the ``inliner`` setting under ``settings.optimizer.details``.
* Type Checker: Fix internal compiler error related to having mapping types in constructor parameter for abstract contracts.
* Type Checker: Fix internal compiler error when attempting to use an invalid external function type on pre-byzantium EVMs.
AST Changes:

View File

@ -721,7 +721,7 @@ void TypeChecker::endVisit(FunctionTypeName const& _funType)
{
solAssert(t->annotation().type, "Type not set for parameter.");
if (!t->annotation().type->interfaceType(false).get())
m_errorReporter.typeError(2582_error, t->location(), "Internal type cannot be used for external function type.");
m_errorReporter.fatalTypeError(2582_error, t->location(), "Internal type cannot be used for external function type.");
}
solAssert(fun.interfaceType(false), "External function type uses internal types.");
}

View File

@ -0,0 +1,8 @@
contract C {
function f() public {
function() external returns (function() internal) getCallback;
getCallback();
}
}
// ----
// TypeError 2582: (76-96): Internal type cannot be used for external function type.

View File

@ -0,0 +1,9 @@
contract C {
function f(
function() external returns (function() internal) getCallback
) public {
getCallback();
}
}
// ----
// TypeError 2582: (66-86): Internal type cannot be used for external function type.