Hi!

On
extern void baz (int);
template <long N>
void
f7 (int i, int x, int y)
{
#pragma omp parallel for
  for (i = x - 10; i <= y + 10; i += N)
    baz (i);
}
part of libgomp.c++/for-2.C testcase we now ICE, because the increment
expression contains IMPLICIT_CONV_EXPR.  Fixed by also using
cp_parser_omp_for_incr when processing_template_decl and, while
decl is NULL, real_decl is non-NULL (if decl is non-NULL, real_decl
is equal to that).

Bootstrapped/regtested on x86_64-linux and i686-linux, does this look ok
to you?

2011-12-12  Jakub Jelinek  <ja...@redhat.com>

        PR c++/51496
        * parser.c (cp_parser_omp_for_loop): When determining whether
        to use cp_parser_omp_for_incr or cp_parser_expression and when
        calling cp_parser_omp_for_incr, use real_decl instead of decl.

--- gcc/cp/parser.c.jj  2011-12-11 22:02:36.000000000 +0100
+++ gcc/cp/parser.c     2011-12-12 13:11:27.338530238 +0100
@@ -26304,11 +26304,11 @@ cp_parser_omp_for_loop (cp_parser *parse
        {
          /* If decl is an iterator, preserve the operator on decl
             until finish_omp_for.  */
-         if (decl
+         if (real_decl
              && ((processing_template_decl
-                  && !POINTER_TYPE_P (TREE_TYPE (decl)))
-                 || CLASS_TYPE_P (TREE_TYPE (decl))))
-           incr = cp_parser_omp_for_incr (parser, decl);
+                  && !POINTER_TYPE_P (TREE_TYPE (real_decl)))
+                 || CLASS_TYPE_P (TREE_TYPE (real_decl))))
+           incr = cp_parser_omp_for_incr (parser, real_decl);
          else
            incr = cp_parser_expression (parser, false, NULL);
        }

        Jakub

Reply via email to