aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-01-23 15:39:43 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-01-23 15:39:43 +0100
commitd0f2db231639f73802c07f03cf4a77125a0daeb7 (patch)
tree0b7b021ab86da9f22550c1365c406ea8440c67b6
parentef192ae1b63da0d71d0fb881d26b27db35fa2920 (diff)
downloadgcc-d0f2db231639f73802c07f03cf4a77125a0daeb7.zip
gcc-d0f2db231639f73802c07f03cf4a77125a0daeb7.tar.gz
gcc-d0f2db231639f73802c07f03cf4a77125a0daeb7.tar.bz2
re PR c++/88984 (ICE in genericize_switch_stmt, at cp/cp-gimplify.c:377)
PR c++/88984 * cp-gimplify.c (genericize_switch_stmt): Move cond genericization before the begin_bc_block call. * c-c++-common/pr88984.c: New test. From-SVN: r268187
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-gimplify.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/pr88984.c19
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 20a5471..363dff1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/88984
+ * cp-gimplify.c (genericize_switch_stmt): Move cond genericization
+ before the begin_bc_block call.
+
2019-01-21 Jason Merrill <jason@redhat.com>
PR c++/87893 - constexpr ctor ICE on ARM.
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 121dfa4..e476b8f 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -356,16 +356,17 @@ genericize_switch_stmt (tree *stmt_p, int *walk_subtrees, void *data)
tree break_block, body, cond, type;
location_t stmt_locus = EXPR_LOCATION (stmt);
- break_block = begin_bc_block (bc_break, stmt_locus);
-
body = SWITCH_STMT_BODY (stmt);
if (!body)
body = build_empty_stmt (stmt_locus);
cond = SWITCH_STMT_COND (stmt);
type = SWITCH_STMT_TYPE (stmt);
- cp_walk_tree (&body, cp_genericize_r, data, NULL);
cp_walk_tree (&cond, cp_genericize_r, data, NULL);
+
+ break_block = begin_bc_block (bc_break, stmt_locus);
+
+ cp_walk_tree (&body, cp_genericize_r, data, NULL);
cp_walk_tree (&type, cp_genericize_r, data, NULL);
*walk_subtrees = 0;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d91be29..c6006e0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/88984
+ * c-c++-common/pr88984.c: New test.
+
2019-01-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/89008
diff --git a/gcc/testsuite/c-c++-common/pr88984.c b/gcc/testsuite/c-c++-common/pr88984.c
new file mode 100644
index 0000000..48c6220
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr88984.c
@@ -0,0 +1,19 @@
+/* PR c++/88984 */
+/* { dg-do run } */
+
+void
+foo (int x, int y)
+{
+ while (x > 0)
+ switch (({ if (y) break; y; }))
+ {
+ case 2: x = 0;
+ }
+}
+
+int
+main ()
+{
+ foo (1, 1);
+ return 0;
+}