From 72f7792f8e09b41987ddd493984402891d49238f Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 13 Oct 2015 14:31:24 +0200 Subject: Some further test fixes. --- libsolidity/Parser.cpp | 43 ++++++++++++++++++++++--------------------- libsolidity/TypeChecker.cpp | 17 +++++++++++++---- 2 files changed, 35 insertions(+), 25 deletions(-) (limited to 'libsolidity') 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 Parser::parseVariableDeclarationStateme // Parse `var (a, b, ,, c) = ...` into a single VariableDeclarationStatement with multiple variables. m_scanner->next(); m_scanner->next(); - while (true) - { - ASTPointer var; - if ( - m_scanner->currentToken() != Token::Comma && - m_scanner->currentToken() != Token::RParen - ) + if (m_scanner->currentToken() != Token::RParen) + while (true) { - ASTNodeFactory varDeclNodeFactory(*this); - ASTPointer name = expectIdentifierToken(); - var = varDeclNodeFactory.createNode( - ASTPointer(), - name, - ASTPointer(), - VariableDeclaration::Visibility::Default - ); + ASTPointer var; + if ( + m_scanner->currentToken() != Token::Comma && + m_scanner->currentToken() != Token::RParen + ) + { + ASTNodeFactory varDeclNodeFactory(*this); + ASTPointer name = expectIdentifierToken(); + var = varDeclNodeFactory.createNode( + ASTPointer(), + name, + ASTPointer(), + 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& assignments = _statement.annotation().assignments; assignments.resize(valueTypes.size(), nullptr); vector> 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(); -- cgit v1.2.3