diff options
author | Jason Merrill <jason@redhat.com> | 2020-03-10 16:05:18 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-03-10 16:30:56 -0400 |
commit | 14af5d9b19b0f4ee1d929e505e245ae5c2f6bdc6 (patch) | |
tree | bab7ae0a1629bb7174dcab14477047e93da64e87 /gcc/cp | |
parent | e00cb200f39d8144de226e76c5d0257b613dbbf6 (diff) | |
download | gcc-14af5d9b19b0f4ee1d929e505e245ae5c2f6bdc6.zip gcc-14af5d9b19b0f4ee1d929e505e245ae5c2f6bdc6.tar.gz gcc-14af5d9b19b0f4ee1d929e505e245ae5c2f6bdc6.tar.bz2 |
c++: Partially revert patch for PR66139.
The patch for 66139 exposed a long-standing bug with
split_nonconstant_init (since 4.7, apparently): initializion of individual
elements of an aggregate are not a full-expressions, but
split_nonconstant_init was making full-expressions out of them. My fix for
66139 extended the use of split_nonconstant_init, and thus the bug, to
aggregate initialization of temporaries within an expression, in which
context (PR94041) the bug is more noticeable. PR93922 is a problem with my
implementation strategy of splitting out at gimplification time, introducing
function calls that weren't in the GENERIC. So I'm going to revert the
patch now and try again for GCC 11.
gcc/cp/ChangeLog
2020-03-10 Jason Merrill <jason@redhat.com>
PR c++/93922
PR c++/94041
PR c++/52320
PR c++/66139
* cp-gimplify.c (cp_gimplify_init_expr): Partially revert patch for
66139: Don't split_nonconstant_init. Remove pre_p parameter.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 20 |
2 files changed, 11 insertions, 18 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9807ad..e62aefd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2020-03-10 Jason Merrill <jason@redhat.com> + + PR c++/93922 + PR c++/94041 + PR c++/52320 + PR c++/66139 + * cp-gimplify.c (cp_gimplify_init_expr): Partially revert patch for + 66139: Don't split_nonconstant_init. Remove pre_p parameter. + 2020-03-09 Marek Polacek <polacek@redhat.com> PR c++/92031 - bogus taking address of rvalue error. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 10ab995..23a25e5 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -513,7 +513,7 @@ gimplify_expr_stmt (tree *stmt_p) /* Gimplify initialization from an AGGR_INIT_EXPR. */ static void -cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p) +cp_gimplify_init_expr (tree *expr_p) { tree from = TREE_OPERAND (*expr_p, 1); tree to = TREE_OPERAND (*expr_p, 0); @@ -526,22 +526,6 @@ cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p) 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 - the CONSTRUCTOR with split_nonconstant_init. */ - if (TREE_CODE (from) == CONSTRUCTOR - && flag_exceptions - && TREE_SIDE_EFFECTS (from) - && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (to))) - { - gimplify_expr (&to, pre_p, NULL, is_gimple_lvalue, fb_lvalue); - replace_placeholders (from, to); - from = split_nonconstant_init (to, from); - cp_genericize_tree (&from, false); - copy_if_shared (&from); - *expr_p = from; - return; - } - /* Look through any COMPOUND_EXPRs, since build_compound_expr pushes them inside the TARGET_EXPR. */ for (t = from; t; ) @@ -734,7 +718,7 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) LHS of an assignment might also be involved in the RHS, as in bug 25979. */ case INIT_EXPR: - cp_gimplify_init_expr (expr_p, pre_p); + cp_gimplify_init_expr (expr_p); if (TREE_CODE (*expr_p) != INIT_EXPR) return GS_OK; /* Fall through. */ |