Fix crash for double variable declaration in the same scope.

This commit is contained in:
Leonardo Alt 2018-07-06 11:04:30 +02:00
parent 0e9415bc31
commit c286cdaa62
6 changed files with 44 additions and 1 deletions

View File

@ -96,6 +96,11 @@ void DeclarationContainer::activateVariable(ASTString const& _name)
m_invisibleDeclarations.erase(_name);
}
bool DeclarationContainer::isInvisible(ASTString const& _name) const
{
return m_invisibleDeclarations.count(_name);
}
bool DeclarationContainer::registerDeclaration(
Declaration const& _declaration,
ASTString const* _name,

View File

@ -62,6 +62,9 @@ public:
/// VariableDeclarationStatements.
void activateVariable(ASTString const& _name);
/// @returns true if declaration is currently invisible.
bool isInvisible(ASTString const& _name) const;
/// @returns existing declaration names similar to @a _name.
/// Searches this and all parent containers.
std::vector<ASTString> similarNames(ASTString const& _name) const;

View File

@ -156,7 +156,8 @@ bool NameAndTypeResolver::updateDeclaration(Declaration const& _declaration)
void NameAndTypeResolver::activateVariable(string const& _name)
{
solAssert(m_currentScope, "");
m_currentScope->activateVariable(_name);
if (m_currentScope->isInvisible(_name))
m_currentScope->activateVariable(_name);
}
vector<Declaration const*> NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const

View File

@ -0,0 +1,10 @@
contract test {
function f() pure public {
uint x;
{ uint x; }
uint x;
}
}
// ----
// Warning: (73-79): This declaration shadows an existing declaration.
// DeclarationError: (91-97): Identifier already declared.

View File

@ -0,0 +1,8 @@
contract test {
function f() pure public {
uint x;
uint x;
}
}
// ----
// DeclarationError: (71-77): Identifier already declared.

View File

@ -0,0 +1,16 @@
contract test {
function f() pure public {
uint x;
uint x;
uint x;
uint x;
uint x;
uint x;
}
}
// ----
// DeclarationError: (71-77): Identifier already declared.
// DeclarationError: (87-93): Identifier already declared.
// DeclarationError: (103-109): Identifier already declared.
// DeclarationError: (119-125): Identifier already declared.
// DeclarationError: (135-141): Identifier already declared.