diff options
Diffstat (limited to 'libsolidity/interface')
-rw-r--r-- | libsolidity/interface/CompilerStack.cpp | 34 | ||||
-rw-r--r-- | libsolidity/interface/CompilerStack.h | 3 |
2 files changed, 37 insertions, 0 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index b7284c44..9ddc345d 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -159,6 +159,9 @@ bool CompilerStack::parse() m_contracts[contract->name()].contract = contract; } + if (!checkLibraryNameClashes()) + noErrors = false; + for (Source const* source: m_sourceOrder) for (ASTPointer<ASTNode> const& node: source->ast->nodes()) if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) @@ -436,6 +439,37 @@ void CompilerStack::resolveImports() swap(m_sourceOrder, sourceOrder); } +bool CompilerStack::checkLibraryNameClashes() +{ + bool clashFound = false; + map<string, SourceLocation> libraries; + for (Source const* source: m_sourceOrder) + for (ASTPointer<ASTNode> const& node: source->ast->nodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + if (contract->isLibrary()) + { + if (libraries.count(contract->name())) + { + auto err = make_shared<Error>(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); + clashFound = true; + } + 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. diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index 8d265931..517d0055 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -210,6 +210,9 @@ private: /// @returns the newly loaded sources. StringMap loadMissingSources(SourceUnit const& _ast, std::string const& _path); void resolveImports(); + /// Checks whether there are libraries with the same name, reports that as an error and + /// @returns false in this case. + bool checkLibraryNameClashes(); /// @returns the absolute path corresponding to @a _path relative to @a _reference. std::string absolutePath(std::string const& _path, std::string const& _reference) const; /// Compile a single contract and put the result in @a _compiledContracts. |