From: Jakub Jelinek Date: Sun, 5 Jan 2020 00:49:14 +0000 (+0100) Subject: re PR c++/93046 (ICE in cp_gimplify_init_expr) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=72036b59a0143c61acd2652a832e3903e180d0f9;p=gcc.git re PR c++/93046 (ICE in cp_gimplify_init_expr) PR c++/93046 * cp-gimplify.c (cp_gimplify_init_expr): Don't look through TARGET_EXPR if it has been gimplified already. * g++.dg/ext/cond4.C: New test. From-SVN: r279884 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 421048b79d0..a1fb787e555 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-01-05 Jakub Jelinek + + PR c++/93046 + * cp-gimplify.c (cp_gimplify_init_expr): Don't look through + TARGET_EXPR if it has been gimplified already. + 2020-01-03 Jason Merrill PR c++/93033 - incorrect tree node sharing with array init. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index eb552767f61..1d2a77d2c0a 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -523,7 +523,7 @@ cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p) think that such code never uses the TARGET_EXPR as an initializer. If I'm wrong, we'll abort because the temp won't have any RTL. In that case, I guess we'll need to replace references somehow. */ - if (TREE_CODE (from) == TARGET_EXPR) + if (TREE_CODE (from) == TARGET_EXPR && TARGET_EXPR_INITIAL (from)) from = TARGET_EXPR_INITIAL (from); /* If we might need to clean up a partially constructed object, break down diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18f14799d7d..4581c9f6c27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-05 Jakub Jelinek + + PR c++/93046 + * g++.dg/ext/cond4.C: New test. + 2020-01-04 Tobias Burnus PR fortran/91640 diff --git a/gcc/testsuite/g++.dg/ext/cond4.C b/gcc/testsuite/g++.dg/ext/cond4.C new file mode 100644 index 00000000000..d2853f40387 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cond4.C @@ -0,0 +1,14 @@ +// PR c++/93046 +// { dg-do compile } +// { dg-options "" } + +struct S { + S (int); + operator bool (); +}; + +S +foo () +{ + return S (1) ? : S (2); +}