aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/DeclarationContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/analysis/DeclarationContainer.cpp')
-rw-r--r--libsolidity/analysis/DeclarationContainer.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp
index 1599b83a..b33c8568 100644
--- a/libsolidity/analysis/DeclarationContainer.cpp
+++ b/libsolidity/analysis/DeclarationContainer.cpp
@@ -42,12 +42,33 @@ Declaration const* DeclarationContainer::conflictingDeclaration(
if (m_invisibleDeclarations.count(*_name))
declarations += m_invisibleDeclarations.at(*_name);
- if (dynamic_cast<FunctionDefinition const*>(&_declaration))
+ if (
+ dynamic_cast<FunctionDefinition const*>(&_declaration) ||
+ dynamic_cast<EventDefinition const*>(&_declaration)
+ )
{
- // check that all other declarations with the same name are functions
+ // check that all other declarations with the same name are functions or a public state variable or events.
+ // And then check that the signatures are different.
for (Declaration const* declaration: declarations)
- if (!dynamic_cast<FunctionDefinition const*>(declaration))
+ {
+ if (auto variableDeclaration = dynamic_cast<VariableDeclaration const*>(declaration))
+ {
+ if (variableDeclaration->isStateVariable() && !variableDeclaration->isConstant() && variableDeclaration->isPublic())
+ continue;
return declaration;
+ }
+ if (
+ dynamic_cast<FunctionDefinition const*>(&_declaration) &&
+ !dynamic_cast<FunctionDefinition const*>(declaration)
+ )
+ return declaration;
+ if (
+ dynamic_cast<EventDefinition const*>(&_declaration) &&
+ !dynamic_cast<EventDefinition const*>(declaration)
+ )
+ return declaration;
+ // Or, continue.
+ }
}
else if (declarations.size() == 1 && declarations.front() == &_declaration)
return nullptr;