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