From: Manuel López-Ibáñez Date: Wed, 20 Aug 2008 16:35:21 +0000 (+0000) Subject: re PR c++/35158 (g++ does not compile valid C++ for loops with -fopenmp) X-Git-Tag: releases/gcc-4.4.0~3001 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e03ef471e13c19498c64ac0ee4976f2ab5c03fe;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3b6e97e62fad..a8a212fa505f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9f992b9a4808..ccbecd760c19 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 2a6c60eaaf01..448279ef886e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-08-20 Manuel Lopez-Ibanez + + PR c++/35158 + * g++.dg/gomp/pr35158.C: New. + 2008-08-20 Manuel Lopez-Ibanez PR 35701 diff --git a/gcc/testsuite/g++.dg/gomp/pr35158.C b/gcc/testsuite/g++.dg/gomp/pr35158.C new file mode 100644 index 000000000000..933eba1ab2c0 --- /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; +}