aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-10-13 20:31:24 +0800
committerchriseth <c@ethdev.com>2015-10-13 20:31:24 +0800
commit72f7792f8e09b41987ddd493984402891d49238f (patch)
treebaed9ab43931470a8c60b73e6593de605223ee32
parent13d7bc4ee8effe78dd496064065717af2cbeacc0 (diff)
downloaddexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar.gz
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar.bz2
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar.lz
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar.xz
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.tar.zst
dexon-solidity-72f7792f8e09b41987ddd493984402891d49238f.zip
Some further test fixes.
-rw-r--r--libsolidity/Parser.cpp43
-rw-r--r--libsolidity/TypeChecker.cpp17
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp3
3 files changed, 37 insertions, 26 deletions
diff --git a/libsolidity/Parser.cpp b/libsolidity/Parser.cpp
index 98e1fbf8..88a6b030 100644
--- a/libsolidity/Parser.cpp
+++ b/libsolidity/Parser.cpp
@@ -785,29 +785,30 @@ ASTPointer<VariableDeclarationStatement> Parser::parseVariableDeclarationStateme
// Parse `var (a, b, ,, c) = ...` into a single VariableDeclarationStatement with multiple variables.
m_scanner->next();
m_scanner->next();
- while (true)
- {
- ASTPointer<VariableDeclaration> var;
- if (
- m_scanner->currentToken() != Token::Comma &&
- m_scanner->currentToken() != Token::RParen
- )
+ if (m_scanner->currentToken() != Token::RParen)
+ while (true)
{
- ASTNodeFactory varDeclNodeFactory(*this);
- ASTPointer<ASTString> name = expectIdentifierToken();
- var = varDeclNodeFactory.createNode<VariableDeclaration>(
- ASTPointer<TypeName>(),
- name,
- ASTPointer<Expression>(),
- VariableDeclaration::Visibility::Default
- );
+ ASTPointer<VariableDeclaration> var;
+ if (
+ m_scanner->currentToken() != Token::Comma &&
+ m_scanner->currentToken() != Token::RParen
+ )
+ {
+ ASTNodeFactory varDeclNodeFactory(*this);
+ ASTPointer<ASTString> name = expectIdentifierToken();
+ var = varDeclNodeFactory.createNode<VariableDeclaration>(
+ ASTPointer<TypeName>(),
+ name,
+ ASTPointer<Expression>(),
+ VariableDeclaration::Visibility::Default
+ );
+ }
+ variables.push_back(var);
+ if (m_scanner->currentToken() == Token::RParen)
+ break;
+ else
+ expectToken(Token::Comma);
}
- variables.push_back(var);
- if (m_scanner->currentToken() == Token::RParen)
- break;
- else
- expectToken(Token::Comma);
- }
nodeFactory.markEndPosition();
m_scanner->next();
}
diff --git a/libsolidity/TypeChecker.cpp b/libsolidity/TypeChecker.cpp
index db13e6f2..afffe344 100644
--- a/libsolidity/TypeChecker.cpp
+++ b/libsolidity/TypeChecker.cpp
@@ -589,7 +589,6 @@ void TypeChecker::endVisit(Return const& _return)
bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
{
- solAssert(!_statement.declarations().empty(), "");
if (!_statement.initialValue())
{
// No initial value is only permitted for single variables with specified type.
@@ -628,14 +627,24 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
vector<VariableDeclaration const*>& assignments = _statement.annotation().assignments;
assignments.resize(valueTypes.size(), nullptr);
vector<ASTPointer<VariableDeclaration>> const& variables = _statement.declarations();
- if (valueTypes.size() != variables.size() && !variables.front() && !variables.back())
+ if (variables.empty())
+ {
+ if (!valueTypes.empty())
+ fatalTypeError(
+ _statement,
+ "Too many components (" +
+ toString(valueTypes.size()) +
+ ") in value for variable assignment (0) needed"
+ );
+ }
+ else if (valueTypes.size() != variables.size() && !variables.front() && !variables.back())
fatalTypeError(
_statement,
"Wildcard both at beginning and end of variable declaration list is only allowed "
"if the number of components is equal."
);
size_t minNumValues = variables.size();
- if (!variables.back() || !variables.front())
+ if (!variables.empty() && (!variables.back() || !variables.front()))
--minNumValues;
if (valueTypes.size() < minNumValues)
fatalTypeError(
@@ -654,7 +663,7 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
toString(minNumValues) +
" needed)."
);
- bool fillRight = (!variables.back() || variables.front());
+ bool fillRight = !variables.empty() && (!variables.back() || variables.front());
for (size_t i = 0; i < min(variables.size(), valueTypes.size()); ++i)
if (fillRight)
assignments[i] = variables[i].get();
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index b4810af7..cc990c1e 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -2419,9 +2419,10 @@ BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fine)
var (,e,g) = two();
var (,,) = three();
var () = none();
+ }
}
)";
- BOOST_CHECK_NO_THROW(parseAndAnalyseReturnError(text));
+ BOOST_CHECK_NO_THROW(parseAndAnalyse(text));
}
BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_1)