From 0e03ef471e13c19498c64ac0ee4976f2ab5c03fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Wed, 20 Aug 2008 16:35:21 +0000 Subject: [PATCH] re PR c++/35158 (g++ does not compile valid C++ for loops with -fopenmp) 2008-08-20 Manuel Lopez-Ibanez PR c++/35158 cp/ * parser.c (cp_parser_omp_for_loop): Handle parenthesized initializers. testsuite/ * g++.dg/gomp/pr35158.C: New. From-SVN: r139335 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/parser.c | 48 +++++++++++++++++++++++++++---------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/gomp/pr35158.C | 14 +++++++++++ 4 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr35158.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3b6e97e..a8a212f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2008-08-20 Manuel Lopez-Ibanez + PR c++/35158 + * parser.c (cp_parser_omp_for_loop): Handle parenthesized + initializers. + +2008-08-20 Manuel Lopez-Ibanez + * parser.c: Update all calls to inform. * typeck.c: Likewise. * init.c: Likewise. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9f992b9..ccbecd7 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -20859,6 +20859,14 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) this_pre_body = push_stmt_list (); if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) { + /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too): + + init-expr: + var = lb + integer-type var = lb + random-access-iterator-type var = lb + pointer-type var = lb + */ cp_decl_specifier_seq type_specifiers; /* First, try to parse as an initialized declaration. See @@ -20867,8 +20875,10 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) cp_parser_parse_tentatively (parser); cp_parser_type_specifier_seq (parser, /*is_condition=*/false, &type_specifiers); - if (!cp_parser_error_occurred (parser)) + if (cp_parser_parse_definitely (parser)) { + /* If parsing a type specifier seq succeeded, then this + MUST be a initialized declaration. */ tree asm_specification, attributes; cp_declarator *declarator; @@ -20880,9 +20890,10 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) attributes = cp_parser_attributes_opt (parser); asm_specification = cp_parser_asm_specification_opt (parser); - if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)) - cp_parser_require (parser, CPP_EQ, "%<=%>"); - if (cp_parser_parse_definitely (parser)) + if (declarator == cp_error_declarator) + cp_parser_skip_to_end_of_statement (parser); + + else { tree pushed_scope; @@ -20891,8 +20902,21 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) /*prefix_attributes=*/NULL_TREE, &pushed_scope); - if (CLASS_TYPE_P (TREE_TYPE (decl)) - || type_dependent_expression_p (decl)) + if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)) + { + if (cp_lexer_next_token_is (parser->lexer, + CPP_OPEN_PAREN)) + error ("parenthesized initialization is not allowed in " + "OpenMP % loop"); + else + /* Trigger an error. */ + cp_parser_require (parser, CPP_EQ, "%<=%>"); + + init = error_mark_node; + cp_parser_skip_to_end_of_statement (parser); + } + else if (CLASS_TYPE_P (TREE_TYPE (decl)) + || type_dependent_expression_p (decl)) { bool is_direct_init, is_non_constant_init; @@ -20915,7 +20939,8 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) } else { - cp_parser_require (parser, CPP_EQ, "%<=%>"); + /* Consume '='. */ + cp_lexer_consume_token (parser->lexer); init = cp_parser_assignment_expression (parser, false); if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE) @@ -20931,14 +20956,11 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses) pop_scope (pushed_scope); } } - else - cp_parser_abort_tentative_parse (parser); - - /* If parsing as an initialized declaration failed, try again as - a simple expression. */ - if (decl == NULL) + else { cp_id_kind idk; + /* If parsing a type specifier sequence failed, then + this MUST be a simple expression. */ cp_parser_parse_tentatively (parser); decl = cp_parser_primary_expression (parser, false, false, false, &idk); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a6c60e..448279e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2008-08-20 Manuel Lopez-Ibanez + PR c++/35158 + * g++.dg/gomp/pr35158.C: New. + +2008-08-20 Manuel Lopez-Ibanez + PR 35701 * gcc.dg/pr35701.c: New. * gcc.dg/Wconversion-real-integer.c: Add more tests. diff --git a/gcc/testsuite/g++.dg/gomp/pr35158.C b/gcc/testsuite/g++.dg/gomp/pr35158.C new file mode 100644 index 0000000..933eba1 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35158.C @@ -0,0 +1,14 @@ +// PR c++/35158 +// { dg-do compile } +// { dg-options "-fopenmp" } + +int main(int argc, char *argv[]) +{ +#pragma omp parallel for + for (int i(0) ; // { dg-error "error: parenthesized initialization is not allowed in OpenMP 'for' loop" } + i < 10 ; + i++) + ; + + return 0; +} -- 2.7.4