mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4443 from ethereum/double_var_decl_fix
Fix crash when declaring the same var twice in the same scope
This commit is contained in:
commit
99bee7e233
@ -96,6 +96,11 @@ void DeclarationContainer::activateVariable(ASTString const& _name)
|
|||||||
m_invisibleDeclarations.erase(_name);
|
m_invisibleDeclarations.erase(_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DeclarationContainer::isInvisible(ASTString const& _name) const
|
||||||
|
{
|
||||||
|
return m_invisibleDeclarations.count(_name);
|
||||||
|
}
|
||||||
|
|
||||||
bool DeclarationContainer::registerDeclaration(
|
bool DeclarationContainer::registerDeclaration(
|
||||||
Declaration const& _declaration,
|
Declaration const& _declaration,
|
||||||
ASTString const* _name,
|
ASTString const* _name,
|
||||||
|
@ -62,6 +62,9 @@ public:
|
|||||||
/// VariableDeclarationStatements.
|
/// VariableDeclarationStatements.
|
||||||
void activateVariable(ASTString const& _name);
|
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.
|
/// @returns existing declaration names similar to @a _name.
|
||||||
/// Searches this and all parent containers.
|
/// Searches this and all parent containers.
|
||||||
std::vector<ASTString> similarNames(ASTString const& _name) const;
|
std::vector<ASTString> similarNames(ASTString const& _name) const;
|
||||||
|
@ -156,7 +156,13 @@ bool NameAndTypeResolver::updateDeclaration(Declaration const& _declaration)
|
|||||||
void NameAndTypeResolver::activateVariable(string const& _name)
|
void NameAndTypeResolver::activateVariable(string const& _name)
|
||||||
{
|
{
|
||||||
solAssert(m_currentScope, "");
|
solAssert(m_currentScope, "");
|
||||||
m_currentScope->activateVariable(_name);
|
// Scoped local variables are invisible before activation.
|
||||||
|
// When a local variable is activated, its name is removed
|
||||||
|
// from a scope's invisible variables.
|
||||||
|
// This is used to avoid activation of variables of same name
|
||||||
|
// in the same scope (an error is returned).
|
||||||
|
if (m_currentScope->isInvisible(_name))
|
||||||
|
m_currentScope->activateVariable(_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Declaration const*> NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const
|
vector<Declaration const*> NameAndTypeResolver::resolveName(ASTString const& _name, ASTNode const* _scope) const
|
||||||
|
@ -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.
|
@ -0,0 +1,8 @@
|
|||||||
|
contract test {
|
||||||
|
function f() pure public {
|
||||||
|
uint x;
|
||||||
|
uint x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (71-77): Identifier already declared.
|
@ -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.
|
Loading…
Reference in New Issue
Block a user