]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/35158 (g++ does not compile valid C++ for loops with -fopenmp)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Wed, 20 Aug 2008 16:35:21 +0000 (16:35 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Wed, 20 Aug 2008 16:35:21 +0000 (16:35 +0000)
2008-08-20  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

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
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr35158.C [new file with mode: 0644]

index 3b6e97e62fadac0f760fb08595571351aa63b620..a8a212fa505f55c63a0bd53fbd3e69de6983c5ee 100644 (file)
@@ -1,3 +1,9 @@
+2008-08-20  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+       PR c++/35158
+       * parser.c (cp_parser_omp_for_loop): Handle parenthesized
+       initializers.
+
 2008-08-20  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        * parser.c: Update all calls to inform.
index 9f992b9a48086d9a34f7cb9d5e4aa4cde498f7e4..ccbecd760c191426aada4726770341b4b5755e79 100644 (file)
@@ -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 %<for%> 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);
index 2a6c60eaaf010a526f29af9cff06defea359383f..448279ef886e400b94f2be714b5b5c9426aa5c75 100644 (file)
@@ -1,3 +1,8 @@
+2008-08-20  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+       PR c++/35158
+       * g++.dg/gomp/pr35158.C: New.
+
 2008-08-20  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        PR 35701
diff --git a/gcc/testsuite/g++.dg/gomp/pr35158.C b/gcc/testsuite/g++.dg/gomp/pr35158.C
new file mode 100644 (file)
index 0000000..933eba1
--- /dev/null
@@ -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;
+}