diff options
author | Yoichi Hirai <i@yoichihirai.com> | 2016-11-02 00:18:00 +0800 |
---|---|---|
committer | Yoichi Hirai <i@yoichihirai.com> | 2017-01-12 01:28:11 +0800 |
commit | bff76c1ca0433f88874fded8990f39292483d9f0 (patch) | |
tree | 0b7fa454be0fa05c6d7911405f66bd9075b5a3c7 /libsolidity/analysis | |
parent | fa157883f528898cee56762f00c15decd3244722 (diff) | |
download | dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.gz dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.zst dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.zip |
analysis: report errors when inheritance causes collision
Diffstat (limited to 'libsolidity/analysis')
-rw-r--r-- | libsolidity/analysis/NameAndTypeResolver.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/libsolidity/analysis/NameAndTypeResolver.cpp b/libsolidity/analysis/NameAndTypeResolver.cpp index 2a33a501..fc107ba0 100644 --- a/libsolidity/analysis/NameAndTypeResolver.cpp +++ b/libsolidity/analysis/NameAndTypeResolver.cpp @@ -289,7 +289,31 @@ void NameAndTypeResolver::importInheritedScope(ContractDefinition const& _base) for (auto const& declaration: nameAndDeclaration.second) // Import if it was declared in the base, is not the constructor and is visible in derived classes if (declaration->scope() == &_base && declaration->isVisibleInDerivedContracts()) - m_currentScope->registerDeclaration(*declaration); + if (!m_currentScope->registerDeclaration(*declaration)) + { + SourceLocation firstDeclarationLocation; + SourceLocation secondDeclarationLocation; + Declaration const* conflictingDeclaration = m_currentScope->conflictingDeclaration(*declaration); + solAssert(conflictingDeclaration, ""); + + if (declaration->location().start < conflictingDeclaration->location().start) + { + firstDeclarationLocation = declaration->location(); + secondDeclarationLocation = conflictingDeclaration->location(); + } + else + { + firstDeclarationLocation = conflictingDeclaration->location(); + secondDeclarationLocation = declaration->location(); + } + + reportDeclarationError( + secondDeclarationLocation, + "Identifier already declared.", + firstDeclarationLocation, + "The previous declaration is here:" + ); + } } void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract) |