mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Error on duplicated super constructor calls
This commit is contained in:
committed by
Daniel Kirchner
parent
fe61435c27
commit
4e037281ac
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user