Hi!

This patch fixes ICE on #pragma GCC ivdep used in templates.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2014-02-19  Jakub Jelinek  <ja...@redhat.com>

        PR c++/60267
        * pt.c (tsubst_expr): Handle ANNOTATE_EXPR.

        * g++.dg/ext/ivdep-1.C: New test.

--- gcc/cp/pt.c.jj      2014-02-18 08:18:51.000000000 +0100
+++ gcc/cp/pt.c 2014-02-19 10:30:24.201080070 +0100
@@ -13806,6 +13806,11 @@ tsubst_expr (tree t, tree args, tsubst_f
                                    RECUR (TREE_OPERAND (t, 1)),
                                    complain));
 
+    case ANNOTATE_EXPR:
+      tmp = RECUR (TREE_OPERAND (t, 0));
+      RETURN (build2_loc (EXPR_LOCATION (t), ANNOTATE_EXPR,
+                         TREE_TYPE (tmp), tmp, RECUR (TREE_OPERAND (t, 1))));
+
     default:
       gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t)));
 
--- gcc/testsuite/g++.dg/ext/ivdep-1.C.jj       2014-02-19 10:31:41.867639731 
+0100
+++ gcc/testsuite/g++.dg/ext/ivdep-1.C  2014-02-19 10:30:59.000000000 +0100
@@ -0,0 +1,18 @@
+// PR c++/60267
+// { dg-do compile }
+// { dg-options "-O3" }
+
+template <int N>
+void
+foo (int *a, int *b, int *c)
+{
+#pragma GCC ivdep
+  for (int i = 0; i < N; i++)
+    a[i] = b[i] * c[i];
+}
+
+void
+bar (int *a, int *b, int *c)
+{
+  foo <64> (a, b, c);
+}

        Jakub

Reply via email to