Commit 640b23d7 by Jason Merrill Committed by Jason Merrill

PR c++/93173 - incorrect tree sharing.

My patch for 93033 wasn't sufficient to handle all the possible sharing
introduced by split_nonconstant_init, and it occurred to me that it would
make sense to use the same unsharing technique as unshare_body, namely
copy_if_shared.

	PR c++/93033
gcc/
	* gimplify.c (copy_if_shared): No longer static.
	* gimplify.h: Declare it.
gcc/cp/
	* cp-gimplify.c (cp_gimplify_init_expr, cp_gimplify_expr): Use
	copy_if_shared after cp_genericize_tree.
	* typeck2.c (split_nonconstant_init): Don't unshare here.

From-SVN: r280126
parent 9b070057
2020-01-10 Jason Merrill <jason@redhat.com>
PR c++/93173 - incorrect tree sharing.
* gimplify.c (copy_if_shared): No longer static.
* gimplify.h: Declare it.
2020-01-10 Richard Sandiford <richard.sandiford@arm.com> 2020-01-10 Richard Sandiford <richard.sandiford@arm.com>
* doc/invoke.texi (-msve-vector-bits=): Document that * doc/invoke.texi (-msve-vector-bits=): Document that
......
2020-01-10 Jason Merrill <jason@redhat.com>
PR c++/93173 - incorrect tree sharing.
PR c++/93033
* cp-gimplify.c (cp_gimplify_init_expr, cp_gimplify_expr): Use
copy_if_shared after cp_genericize_tree.
* typeck2.c (split_nonconstant_init): Don't unshare here.
2020-01-08 Jason Merrill <jason@redhat.com> 2020-01-08 Jason Merrill <jason@redhat.com>
* cp-gimplify.c (cp_gimplify_expr) [TARGET_EXPR]: Check * cp-gimplify.c (cp_gimplify_expr) [TARGET_EXPR]: Check
......
...@@ -537,6 +537,7 @@ cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p) ...@@ -537,6 +537,7 @@ cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p)
replace_placeholders (from, to); replace_placeholders (from, to);
from = split_nonconstant_init (to, from); from = split_nonconstant_init (to, from);
cp_genericize_tree (&from, false); cp_genericize_tree (&from, false);
copy_if_shared (&from);
*expr_p = from; *expr_p = from;
return; return;
} }
...@@ -712,6 +713,7 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) ...@@ -712,6 +713,7 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
hash_set<tree> pset; hash_set<tree> pset;
cp_walk_tree (expr_p, cp_fold_r, &pset, NULL); cp_walk_tree (expr_p, cp_fold_r, &pset, NULL);
cp_genericize_tree (expr_p, false); cp_genericize_tree (expr_p, false);
copy_if_shared (expr_p);
ret = GS_OK; ret = GS_OK;
input_location = loc; input_location = loc;
} }
......
...@@ -34,7 +34,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -34,7 +34,6 @@ along with GCC; see the file COPYING3. If not see
#include "intl.h" #include "intl.h"
#include "gcc-rich-location.h" #include "gcc-rich-location.h"
#include "target.h" #include "target.h"
#include "gimplify.h"
static tree static tree
process_init_constructor (tree type, tree init, int nested, int flags, process_init_constructor (tree type, tree init, int nested, int flags,
...@@ -792,8 +791,7 @@ split_nonconstant_init (tree dest, tree init) ...@@ -792,8 +791,7 @@ split_nonconstant_init (tree dest, tree init)
} }
else if (init) else if (init)
{ {
tree ie = build2 (INIT_EXPR, void_type_node, tree ie = build2 (INIT_EXPR, void_type_node, dest, init);
unshare_expr (dest), init);
code = add_stmt_to_compound (ie, code); code = add_stmt_to_compound (ie, code);
} }
} }
......
...@@ -937,7 +937,7 @@ copy_if_shared_r (tree *tp, int *walk_subtrees, void *data) ...@@ -937,7 +937,7 @@ copy_if_shared_r (tree *tp, int *walk_subtrees, void *data)
/* Unshare most of the shared trees rooted at *TP. DATA is passed to the /* Unshare most of the shared trees rooted at *TP. DATA is passed to the
copy_if_shared_r callback unmodified. */ copy_if_shared_r callback unmodified. */
static inline void void
copy_if_shared (tree *tp, void *data) copy_if_shared (tree *tp, void *data)
{ {
walk_tree (tp, copy_if_shared_r, data, NULL); walk_tree (tp, copy_if_shared_r, data, NULL);
......
...@@ -62,6 +62,7 @@ extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq * = NULL, ...@@ -62,6 +62,7 @@ extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq * = NULL,
extern void declare_vars (tree, gimple *, bool); extern void declare_vars (tree, gimple *, bool);
extern void gimple_add_tmp_var (tree); extern void gimple_add_tmp_var (tree);
extern void gimple_add_tmp_var_fn (struct function *, tree); extern void gimple_add_tmp_var_fn (struct function *, tree);
extern void copy_if_shared (tree *, void * = NULL);
extern tree unshare_expr (tree); extern tree unshare_expr (tree);
extern tree unshare_expr_without_location (tree); extern tree unshare_expr_without_location (tree);
extern tree voidify_wrapper_expr (tree, tree); extern tree voidify_wrapper_expr (tree, tree);
......
// PR c++/93173
// { dg-do compile { target c++11 } }
template<typename> struct S1 {
S1(S1 &);
~S1();
};
struct S2 {
S1<void> x;
int y;
int z;
};
void f(S1<void> x, int y, int z) { new S2{x, y, z}; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment