Skip to content

Commit f000d1d

Browse files
Reports an error on unimplemented modifiers in a function definition.
1 parent 1f8f1a3 commit f000d1d

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

libsolidity/analysis/OverrideChecker.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,16 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr
573573
);
574574
}
575575

576+
if (_overriding.unimplemented() && !_super.unimplemented())
577+
overrideError(
578+
_overriding,
579+
_super,
580+
4593_error,
581+
"Overriding an implemented " + _super.astNodeName() +
582+
" with an unimplemented " + _overriding.astNodeName() +
583+
" is not allowed."
584+
);
585+
576586
if (_super.isFunction())
577587
{
578588
FunctionType const* functionType = _overriding.functionType();
@@ -613,14 +623,6 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr
613623
stateMutabilityToString(_overriding.stateMutability()) +
614624
"\"."
615625
);
616-
617-
if (_overriding.unimplemented() && !_super.unimplemented())
618-
overrideError(
619-
_overriding,
620-
_super,
621-
4593_error,
622-
"Overriding an implemented function with an unimplemented function is not allowed."
623-
);
624626
}
625627
}
626628

libsolidity/analysis/PostTypeChecker.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ void PostTypeChecker::endVisit(ModifierInvocation const& _modifierInvocation)
131131
callEndVisit(_modifierInvocation);
132132
}
133133

134+
bool PostTypeChecker::visit(FunctionDefinition const& _functionDefinition)
135+
{
136+
return callVisit(_functionDefinition);
137+
}
138+
139+
void PostTypeChecker::endVisit(FunctionDefinition const& _functionDefinition)
140+
{
141+
callEndVisit(_functionDefinition);
142+
}
143+
134144
namespace
135145
{
136146
struct ConstStateVarCircularReferenceChecker: public PostTypeChecker::Checker
@@ -434,4 +444,5 @@ PostTypeChecker::PostTypeChecker(langutil::ErrorReporter& _errorReporter): m_err
434444
m_checkers.push_back(make_shared<EventOutsideEmitErrorOutsideRevertChecker>(_errorReporter));
435445
m_checkers.push_back(make_shared<NoVariablesInInterfaceChecker>(_errorReporter));
436446
m_checkers.push_back(make_shared<ReservedErrorSelector>(_errorReporter));
447+
//m_checkers.push_back(make_shared<ModifierImplementedChecker>(_errorReporter));
437448
}

libsolidity/analysis/PostTypeChecker.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ class PostTypeChecker: private ASTConstVisitor
9797
bool visit(ModifierInvocation const& _modifierInvocation) override;
9898
void endVisit(ModifierInvocation const& _modifierInvocation) override;
9999

100+
bool visit(FunctionDefinition const& _functionDefinition) override;
101+
void endVisit(FunctionDefinition const& _functionDefinition) override;
102+
100103
template <class T>
101104
bool callVisit(T const& _node)
102105
{
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
contract A {
2+
modifier m() virtual { _; }
3+
}
4+
abstract contract B is A {
5+
modifier m() virtual override;
6+
}
7+
contract C is B {
8+
function f() m public {}
9+
}
10+
// ----
11+
// TypeError 4593: (78-108): Overriding an implemented modifier with an unimplemented modifier is not allowed.

0 commit comments

Comments
 (0)