aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorYoichi Hirai <i@yoichihirai.com>2016-11-02 00:18:00 +0800
committerYoichi Hirai <i@yoichihirai.com>2017-01-12 01:28:11 +0800
commitbff76c1ca0433f88874fded8990f39292483d9f0 (patch)
tree0b7fa454be0fa05c6d7911405f66bd9075b5a3c7 /libsolidity
parentfa157883f528898cee56762f00c15decd3244722 (diff)
downloaddexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.gz
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.bz2
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.lz
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.xz
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.tar.zst
dexon-solidity-bff76c1ca0433f88874fded8990f39292483d9f0.zip
analysis: report errors when inheritance causes collision
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/analysis/NameAndTypeResolver.cpp26
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)