diff options
Diffstat (limited to 'DeclarationContainer.cpp')
-rw-r--r-- | DeclarationContainer.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/DeclarationContainer.cpp b/DeclarationContainer.cpp index 2594d428..565f71df 100644 --- a/DeclarationContainer.cpp +++ b/DeclarationContainer.cpp @@ -22,6 +22,7 @@ #include <libsolidity/DeclarationContainer.h> #include <libsolidity/AST.h> +#include <libsolidity/Types.h> namespace dev { @@ -34,17 +35,34 @@ bool DeclarationContainer::registerDeclaration(Declaration const& _declaration, if (name.empty()) return true; - if (!_update && (m_declarations.count(name) || m_invisibleDeclarations.count(name))) - return false; + if (_update) + { + solAssert(!dynamic_cast<FunctionDefinition const*>(&_declaration), "Attempt to update function definition."); + m_declarations[name].clear(); + m_invisibleDeclarations[name].clear(); + } + else + { + if (dynamic_cast<FunctionDefinition const*>(&_declaration)) + { + // check that all other declarations with the same name are functions + for (auto&& declaration: m_invisibleDeclarations[name] + m_declarations[name]) + if (!dynamic_cast<FunctionDefinition const*>(declaration)) + return false; + } + else if (m_declarations.count(name) > 0 || m_invisibleDeclarations.count(name) > 0) + return false; + } if (_invisible) - m_invisibleDeclarations.insert(name); + m_invisibleDeclarations[name].insert(&_declaration); else - m_declarations[name] = &_declaration; + m_declarations[name].insert(&_declaration); + return true; } -Declaration const* DeclarationContainer::resolveName(ASTString const& _name, bool _recursive) const +std::set<Declaration const*> DeclarationContainer::resolveName(ASTString const& _name, bool _recursive) const { solAssert(!_name.empty(), "Attempt to resolve empty name."); auto result = m_declarations.find(_name); @@ -52,7 +70,7 @@ Declaration const* DeclarationContainer::resolveName(ASTString const& _name, boo return result->second; if (_recursive && m_enclosingContainer) return m_enclosingContainer->resolveName(_name, true); - return nullptr; + return std::set<Declaration const*>({}); } } |