Skip to content

Commit c286cda

Browse files
author
Leonardo Alt
committed
Fix crash for double variable declaration in the same scope.
1 parent 0e9415b commit c286cda

6 files changed

+44
-1
lines changed

libsolidity/analysis/DeclarationContainer.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ void DeclarationContainer::activateVariable(ASTString const& _name)
9696
m_invisibleDeclarations.erase(_name);
9797
}
9898

99+
bool DeclarationContainer::isInvisible(ASTString const& _name) const
100+
{
101+
return m_invisibleDeclarations.count(_name);
102+
}
103+
99104
bool DeclarationContainer::registerDeclaration(
100105
Declaration const& _declaration,
101106
ASTString const* _name,

libsolidity/analysis/DeclarationContainer.h

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ class DeclarationContainer
6262
/// VariableDeclarationStatements.
6363
void activateVariable(ASTString const& _name);
6464

65+
/// @returns true if declaration is currently invisible.
66+
bool isInvisible(ASTString const& _name) const;
67+
6568
/// @returns existing declaration names similar to @a _name.
6669
/// Searches this and all parent containers.
6770
std::vector<ASTString> similarNames(ASTString const& _name) const;

libsolidity/analysis/NameAndTypeResolver.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ bool NameAndTypeResolver::updateDeclaration(Declaration const& _declaration)
156156
void NameAndTypeResolver::activateVariable(string const& _name)
157157
{
158158
solAssert(m_currentScope, "");
159-
m_currentScope->activateVariable(_name);
159+
if (m_currentScope->isInvisible(_name))
160+
m_currentScope->activateVariable(_name);
160161
}
161162

162163
vector<Declaration const*> NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
contract test {
2+
function f() pure public {
3+
uint x;
4+
{ uint x; }
5+
uint x;
6+
}
7+
}
8+
// ----
9+
// Warning: (73-79): This declaration shadows an existing declaration.
10+
// DeclarationError: (91-97): Identifier already declared.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
contract test {
2+
function f() pure public {
3+
uint x;
4+
uint x;
5+
}
6+
}
7+
// ----
8+
// DeclarationError: (71-77): Identifier already declared.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
contract test {
2+
function f() pure public {
3+
uint x;
4+
uint x;
5+
uint x;
6+
uint x;
7+
uint x;
8+
uint x;
9+
}
10+
}
11+
// ----
12+
// DeclarationError: (71-77): Identifier already declared.
13+
// DeclarationError: (87-93): Identifier already declared.
14+
// DeclarationError: (103-109): Identifier already declared.
15+
// DeclarationError: (119-125): Identifier already declared.
16+
// DeclarationError: (135-141): Identifier already declared.

0 commit comments

Comments
 (0)