diff options
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/analysis/StaticAnalyzer.cpp | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp index 6c70ba6b..700c8a71 100644 --- a/libsolidity/analysis/StaticAnalyzer.cpp +++ b/libsolidity/analysis/StaticAnalyzer.cpp @@ -90,33 +90,43 @@ 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; + bool const v050 = m_currentContract->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050); + if (auto contract = dynamic_cast<ContractDefinition const*>(_modifier.name()->annotation().referencedDeclaration)) - for (auto const& specifier: m_currentContract->baseContracts()) - if (modifierOverridesInheritanceSpecifier(contract, _modifier, *specifier)) + for (auto const& base: m_currentContract->annotation().linearizedBaseContracts) + for (auto const& specifier: base->baseContracts()) { - SecondarySourceLocation ssl; - ssl.append("Overriden constructor call is here:", specifier->location()); - - m_errorReporter.declarationError( - _modifier.location(), - ssl, - "Duplicated super constructor call." - ); + Declaration const* parent = specifier->name().annotation().referencedDeclaration; + if (contract == parent && !specifier->arguments().empty()) + { + if (v050) + { + SecondarySourceLocation ssl; + ssl.append("Second constructor call is here:", specifier->location()); + + m_errorReporter.declarationError( + _modifier.location(), + ssl, + "Duplicated super constructor call." + ); + } + else + { + SecondarySourceLocation ssl; + ssl.append("Overridden constructor call is here:", specifier->location()); + + m_errorReporter.warning( + _modifier.location(), + "Duplicated super constructor calls are deprecated.", + ssl + ); + } + } } return true; |