aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-07-18 20:40:12 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-07-18 20:40:12 +0200
commitf4d902955b3d123937ab85866c51f9b665591604 (patch)
tree8238e32a411871e52a341e9c9430771dcdacfd71 /gcc
parentf2111a364039343a3314736d376990dfa549e650 (diff)
downloadgcc-f4d902955b3d123937ab85866c51f9b665591604.zip
gcc-f4d902955b3d123937ab85866c51f9b665591604.tar.gz
gcc-f4d902955b3d123937ab85866c51f9b665591604.tar.bz2
re PR c++/71822 (ICE: in gimplify_expr, at gimplify.c:11025)
PR c++/71822 * cp-gimplify.c (cp_gimplify_expr) <case VEC_INIT_EXPR>: Recursively fold *expr_p before genericizing it. * g++.dg/template/defarg21.C: New test. From-SVN: r238440
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cp-gimplify.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/defarg21.C21
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 888d4aa..3cd6b13 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2016-07-18 Jakub Jelinek <jakub@redhat.com>
+ PR c++/71822
+ * cp-gimplify.c (cp_gimplify_expr) <case VEC_INIT_EXPR>: Recursively
+ fold *expr_p before genericizing it.
+
PR c++/71871
* typeck.c (build_x_conditional_expr): Revert the 2012-10-25 change.
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 8496d7c..de6c929 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -621,6 +621,8 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
init, VEC_INIT_EXPR_VALUE_INIT (*expr_p),
from_array,
tf_warning_or_error);
+ hash_set<tree> pset;
+ cp_walk_tree (expr_p, cp_fold_r, &pset, NULL);
cp_genericize_tree (expr_p);
ret = GS_OK;
input_location = loc;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aa35fb2..2f6471a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-07-18 Jakub Jelinek <jakub@redhat.com>
+ PR c++/71822
+ * g++.dg/template/defarg21.C: New test.
+
PR c++/71871
* g++.dg/ext/vector31.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/defarg21.C b/gcc/testsuite/g++.dg/template/defarg21.C
new file mode 100644
index 0000000..6ac2276
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/defarg21.C
@@ -0,0 +1,21 @@
+// PR c++/71822
+// { dg-do compile }
+
+int bar (int);
+
+template <typename T>
+struct A
+{
+ explicit A (int x = bar (sizeof (T)));
+};
+
+struct B
+{
+ A <int> b[2];
+};
+
+void
+baz ()
+{
+ B b;
+}