Error on duplicated super constructor calls

This commit is contained in:
Federico Bond
2018-04-09 11:22:35 +02:00
committed by Daniel Kirchner
parent fe61435c27
commit 4e037281ac
7 changed files with 55 additions and 9 deletions
+32
View File
@@ -90,6 +90,38 @@ void StaticAnalyzer::endVisit(FunctionDefinition const&)
m_localVarUseCount.clear();
}
bool modifierOverridesInheritanceSpecifier(
ContractDefinition const* _contract,
ModifierInvocation const& _modifier,
InheritanceSpecifier const& _specifier
)
{
auto parent = _specifier.name().annotation().referencedDeclaration;
return _contract == parent && (!_specifier.arguments().empty() || _modifier.arguments().empty());
}
bool StaticAnalyzer::visit(ModifierInvocation const& _modifier)
{
if (!m_constructor)
return true;
if (auto contract = dynamic_cast<ContractDefinition const*>(_modifier.name()->annotation().referencedDeclaration))
for (auto const& specifier: m_currentContract->baseContracts())
if (modifierOverridesInheritanceSpecifier(contract, _modifier, *specifier))
{
SecondarySourceLocation ssl;
ssl.append("Overriden constructor call is here:", specifier->location());
m_errorReporter.declarationError(
_modifier.location(),
ssl,
"Duplicated super constructor call."
);
}
return true;
}
bool StaticAnalyzer::visit(Identifier const& _identifier)
{
if (m_currentFunction)
+1
View File
@@ -57,6 +57,7 @@ private:
virtual bool visit(FunctionDefinition const& _function) override;
virtual void endVisit(FunctionDefinition const& _function) override;
virtual bool visit(ModifierInvocation const& _modifier) override;
virtual bool visit(ExpressionStatement const& _statement) override;
virtual bool visit(VariableDeclaration const& _variable) override;