From 2364c55735f8e511dbed6e46f83975a867839e12 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 11 Jan 2016 19:40:15 +0100 Subject: Detect library name clashes. --- libsolidity/interface/CompilerStack.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index a6f6f224..9a7d6982 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -148,6 +148,9 @@ bool CompilerStack::parse() m_contracts[contract->name()].contract = contract; } + if (!checkLibraryNameClashes()) + noErrors = false; + for (Source const* source: m_sourceOrder) for (ASTPointer const& node: source->ast->nodes()) if (ContractDefinition* contract = dynamic_cast(node.get())) @@ -400,6 +403,36 @@ void CompilerStack::resolveImports() swap(m_sourceOrder, sourceOrder); } +bool CompilerStack::checkLibraryNameClashes() +{ + bool clashFound = false; + map libraries; + for (Source const* source: m_sourceOrder) + for (ASTPointer const& node: source->ast->nodes()) + if (ContractDefinition* contract = dynamic_cast(node.get())) + if (contract->isLibrary()) + { + if (libraries.count(contract->name())) + { + auto err = make_shared(Error::Type::DeclarationError); + *err << + errinfo_sourceLocation(contract->location()) << + errinfo_comment( + "Library \"" + contract->name() + "\" declared twice " + "(will create ambiguities during linking)." + ) << + errinfo_secondarySourceLocation(SecondarySourceLocation().append( + "The other declaration is here:", libraries[contract->name()] + )); + + m_errors.push_back(err); + } + else + libraries[contract->name()] = contract->location(); + } + return !clashFound; +} + string CompilerStack::absolutePath(string const& _path, string const& _reference) const { // Anything that does not start with `.` is an absolute path. -- cgit v1.2.3