C++11: Allow brace-init-list in range-for statement.

Also drop the unused 'initializer' member from
RangeBasedForStatementAST.

Change-Id: I078ebbc85cafa643af4bfe62d698bf7de71360e4
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Christian Kamm
2012-09-18 09:50:23 +02:00
committed by hjk
parent ecd54059d3
commit 9bd86e7d68
12 changed files with 12 additions and 22 deletions

View File

@@ -4362,9 +4362,6 @@ unsigned RangeBasedForStatementAST::firstToken() const
if (declarator) if (declarator)
if (unsigned candidate = declarator->firstToken()) if (unsigned candidate = declarator->firstToken())
return candidate; return candidate;
if (initializer)
if (unsigned candidate = initializer->firstToken())
return candidate;
if (colon_token) if (colon_token)
return colon_token; return colon_token;
if (expression) if (expression)
@@ -4391,9 +4388,6 @@ unsigned RangeBasedForStatementAST::lastToken() const
return candidate; return candidate;
if (colon_token) if (colon_token)
return colon_token + 1; return colon_token + 1;
if (initializer)
if (unsigned candidate = initializer->lastToken())
return candidate;
if (declarator) if (declarator)
if (unsigned candidate = declarator->lastToken()) if (unsigned candidate = declarator->lastToken())
return candidate; return candidate;

View File

@@ -1921,7 +1921,6 @@ public:
SpecifierListAST *type_specifier_list; SpecifierListAST *type_specifier_list;
DeclaratorAST *declarator; DeclaratorAST *declarator;
// or an expression // or an expression
ExpressionAST *initializer;
unsigned colon_token; unsigned colon_token;
ExpressionAST *expression; ExpressionAST *expression;
unsigned rparen_token; unsigned rparen_token;
@@ -1936,7 +1935,6 @@ public:
, lparen_token(0) , lparen_token(0)
, type_specifier_list(0) , type_specifier_list(0)
, declarator(0) , declarator(0)
, initializer(0)
, colon_token(0) , colon_token(0)
, expression(0) , expression(0)
, rparen_token(0) , rparen_token(0)

View File

@@ -681,8 +681,6 @@ RangeBasedForStatementAST *RangeBasedForStatementAST::clone(MemoryPool *pool) co
*ast_iter = new (pool) SpecifierListAST((iter->value) ? iter->value->clone(pool) : 0); *ast_iter = new (pool) SpecifierListAST((iter->value) ? iter->value->clone(pool) : 0);
if (declarator) if (declarator)
ast->declarator = declarator->clone(pool); ast->declarator = declarator->clone(pool);
if (initializer)
ast->initializer = initializer->clone(pool);
ast->colon_token = colon_token; ast->colon_token = colon_token;
if (expression) if (expression)
ast->expression = expression->clone(pool); ast->expression = expression->clone(pool);

View File

@@ -1154,11 +1154,6 @@ bool ASTMatcher::match(RangeBasedForStatementAST *node, RangeBasedForStatementAS
else if (! AST::match(node->declarator, pattern->declarator, this)) else if (! AST::match(node->declarator, pattern->declarator, this))
return false; return false;
if (! pattern->initializer)
pattern->initializer = node->initializer;
else if (! AST::match(node->initializer, pattern->initializer, this))
return false;
pattern->colon_token = node->colon_token; pattern->colon_token = node->colon_token;
if (! pattern->expression) if (! pattern->expression)

View File

@@ -447,12 +447,11 @@ public:
return __ast; return __ast;
} }
RangeBasedForStatementAST *RangeBasedForStatement(SpecifierListAST *type_specifier_list = 0, DeclaratorAST *declarator = 0, ExpressionAST *initializer = 0, ExpressionAST *expression = 0, StatementAST *statement = 0) RangeBasedForStatementAST *RangeBasedForStatement(SpecifierListAST *type_specifier_list = 0, DeclaratorAST *declarator = 0, ExpressionAST *expression = 0, StatementAST *statement = 0)
{ {
RangeBasedForStatementAST *__ast = new (&pool) RangeBasedForStatementAST; RangeBasedForStatementAST *__ast = new (&pool) RangeBasedForStatementAST;
__ast->type_specifier_list = type_specifier_list; __ast->type_specifier_list = type_specifier_list;
__ast->declarator = declarator; __ast->declarator = declarator;
__ast->initializer = initializer;
__ast->expression = expression; __ast->expression = expression;
__ast->statement = statement; __ast->statement = statement;
return __ast; return __ast;

View File

@@ -493,7 +493,6 @@ void RangeBasedForStatementAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) { if (visitor->visit(this)) {
accept(type_specifier_list, visitor); accept(type_specifier_list, visitor);
accept(declarator, visitor); accept(declarator, visitor);
accept(initializer, visitor);
accept(expression, visitor); accept(expression, visitor);
accept(statement, visitor); accept(statement, visitor);
} }

View File

@@ -1332,7 +1332,6 @@ bool Bind::visit(RangeBasedForStatementAST *ast)
block->addMember(decl); block->addMember(decl);
} }
/*ExpressionTy initializer =*/ this->expression(ast->initializer);
/*ExpressionTy expression =*/ this->expression(ast->expression); /*ExpressionTy expression =*/ this->expression(ast->expression);
this->statement(ast->statement); this->statement(ast->statement);
(void) switchScope(previousScope); (void) switchScope(previousScope);

View File

@@ -3429,7 +3429,11 @@ bool Parser::parseForStatement(StatementAST *&node)
ast->colon_token = consumeToken(); ast->colon_token = consumeToken();
blockErrors(blocked); blockErrors(blocked);
if (LA() == T_LBRACE) {
parseBracedInitList0x(ast->expression);
} else {
parseExpression(ast->expression); parseExpression(ast->expression);
}
match(T_RPAREN, &ast->rparen_token); match(T_RPAREN, &ast->rparen_token);
parseStatement(ast->statement); parseStatement(ast->statement);

View File

@@ -1025,7 +1025,6 @@ bool FindUsages::visit(RangeBasedForStatementAST *ast)
this->specifier(it->value); this->specifier(it->value);
} }
this->declarator(ast->declarator); this->declarator(ast->declarator);
this->expression(ast->initializer);
// unsigned comma_token = ast->comma_token; // unsigned comma_token = ast->comma_token;
this->expression(ast->expression); this->expression(ast->expression);
// unsigned rparen_token = ast->rparen_token; // unsigned rparen_token = ast->rparen_token;

View File

@@ -0,0 +1,5 @@
int main() {
for (int x : {1, 2, 3}) {}
for (int x : foo) ;
for (int& x : array) x += 2;
}

View File

@@ -141,6 +141,7 @@ void tst_cxx11::parse_data()
QTest::newRow("defaultdeleteInitializer.1") << "defaultdeleteInitializer.1.cpp" << ""; QTest::newRow("defaultdeleteInitializer.1") << "defaultdeleteInitializer.1.cpp" << "";
QTest::newRow("refQualifier.1") << "refQualifier.1.cpp" << ""; QTest::newRow("refQualifier.1") << "refQualifier.1.cpp" << "";
QTest::newRow("alignofAlignas.1") << "alignofAlignas.1.cpp" << ""; QTest::newRow("alignofAlignas.1") << "alignofAlignas.1.cpp" << "";
QTest::newRow("rangeFor.1") << "rangeFor.1.cpp" << "";
} }
void tst_cxx11::parse() void tst_cxx11::parse()

View File

@@ -662,7 +662,6 @@ virtual bool visit(RangeBasedForStatementAST *ast)
for (SpecifierListAST *iter = ast->type_specifier_list; iter; iter = iter->next) for (SpecifierListAST *iter = ast->type_specifier_list; iter; iter = iter->next)
nonterminal(iter->value); nonterminal(iter->value);
nonterminal(ast->declarator); nonterminal(ast->declarator);
nonterminal(ast->initializer);
if (ast->colon_token) if (ast->colon_token)
terminal(ast->colon_token, ast); terminal(ast->colon_token, ast);
nonterminal(ast->expression); nonterminal(ast->expression);