mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fixes ICE when overriding an implemented modifier with an unimplemented one.
This commit is contained in:
parent
8de575f738
commit
a14ac1923d
@ -31,6 +31,7 @@ Bugfixes:
|
|||||||
* Type Checker: Fix internal compiler error when attempting to use an invalid external function type on pre-byzantium EVMs.
|
* Type Checker: Fix internal compiler error when attempting to use an invalid external function type on pre-byzantium EVMs.
|
||||||
* Type Checker: Make errors about (nested) mapping type in event or error parameter into fatal type errors.
|
* Type Checker: Make errors about (nested) mapping type in event or error parameter into fatal type errors.
|
||||||
* Type Checker: Fix internal compiler error when overriding receive ether function with one having different parameters during inheritance.
|
* Type Checker: Fix internal compiler error when overriding receive ether function with one having different parameters during inheritance.
|
||||||
|
* Type Checker: Fix internal compiler error when overriding an implemented modifier with an unimplemented one.
|
||||||
|
|
||||||
|
|
||||||
AST Changes:
|
AST Changes:
|
||||||
|
@ -573,6 +573,19 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_overriding.unimplemented() && !_super.unimplemented())
|
||||||
|
{
|
||||||
|
solAssert(!_overriding.isVariable() || !_overriding.unimplemented(), "");
|
||||||
|
overrideError(
|
||||||
|
_overriding,
|
||||||
|
_super,
|
||||||
|
4593_error,
|
||||||
|
"Overriding an implemented " + _super.astNodeName() +
|
||||||
|
" with an unimplemented " + _overriding.astNodeName() +
|
||||||
|
" is not allowed."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (_super.isFunction())
|
if (_super.isFunction())
|
||||||
{
|
{
|
||||||
FunctionType const* functionType = _overriding.functionType();
|
FunctionType const* functionType = _overriding.functionType();
|
||||||
@ -613,14 +626,6 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr
|
|||||||
stateMutabilityToString(_overriding.stateMutability()) +
|
stateMutabilityToString(_overriding.stateMutability()) +
|
||||||
"\"."
|
"\"."
|
||||||
);
|
);
|
||||||
|
|
||||||
if (_overriding.unimplemented() && !_super.unimplemented())
|
|
||||||
overrideError(
|
|
||||||
_overriding,
|
|
||||||
_super,
|
|
||||||
4593_error,
|
|
||||||
"Overriding an implemented function with an unimplemented function is not allowed."
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
contract A {
|
||||||
|
modifier m() virtual { _; }
|
||||||
|
}
|
||||||
|
abstract contract B is A {
|
||||||
|
modifier m() virtual override;
|
||||||
|
}
|
||||||
|
contract C is B {
|
||||||
|
function f() m public {}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError 4593: (78-108): Overriding an implemented modifier with an unimplemented modifier is not allowed.
|
@ -0,0 +1,11 @@
|
|||||||
|
contract A {
|
||||||
|
modifier m() virtual { _; }
|
||||||
|
}
|
||||||
|
abstract contract B {
|
||||||
|
modifier m() virtual;
|
||||||
|
}
|
||||||
|
contract C is A, B {
|
||||||
|
modifier m() override(A, B) { _; }
|
||||||
|
function f() m public {}
|
||||||
|
}
|
||||||
|
// ----
|
@ -0,0 +1,11 @@
|
|||||||
|
abstract contract A {
|
||||||
|
modifier m() virtual;
|
||||||
|
}
|
||||||
|
abstract contract B is A {
|
||||||
|
modifier m() virtual override;
|
||||||
|
}
|
||||||
|
abstract contract C is B {
|
||||||
|
modifier m() virtual override;
|
||||||
|
function f() m public {}
|
||||||
|
}
|
||||||
|
// ----
|
@ -0,0 +1,8 @@
|
|||||||
|
abstract contract A {
|
||||||
|
modifier m() virtual;
|
||||||
|
function f() m public {}
|
||||||
|
}
|
||||||
|
contract B is A {
|
||||||
|
modifier m() virtual override { _; }
|
||||||
|
}
|
||||||
|
// ----
|
@ -0,0 +1,8 @@
|
|||||||
|
abstract contract A {
|
||||||
|
modifier m() virtual;
|
||||||
|
function f() m public virtual {}
|
||||||
|
}
|
||||||
|
abstract contract B is A {
|
||||||
|
function f() public override {}
|
||||||
|
}
|
||||||
|
// ----
|
Loading…
Reference in New Issue
Block a user