aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2024-05-22 16:28:02 -0400
committerMarek Polacek <polacek@redhat.com>2024-05-28 14:28:18 -0400
commit5bc731b83b51910dc7f7cacddb4257a16d62ee38 (patch)
treeaf6b604ca4b5e5f808715e00dfa09baf1b429481 /gcc
parentc0d78289fcd9c04110907f8cad90d7e1e5c55a44 (diff)
downloadgcc-5bc731b83b51910dc7f7cacddb4257a16d62ee38.zip
gcc-5bc731b83b51910dc7f7cacddb4257a16d62ee38.tar.gz
gcc-5bc731b83b51910dc7f7cacddb4257a16d62ee38.tar.bz2
c++: mark TARGET_EXPRs for function arguments eliding [PR114707]
Coming back to our discussion in <https://gcc.gnu.org/pipermail/gcc-patches/2024-April/649426.html>: TARGET_EXPRs that initialize a function argument are not marked TARGET_EXPR_ELIDING_P even though gimplify_arg drops such TARGET_EXPRs on the floor. To work around it, I added a pset to replace_placeholders_for_class_temp_r, but it would be best to just rely on TARGET_EXPR_ELIDING_P. PR c++/114707 gcc/cp/ChangeLog: * call.cc (convert_for_arg_passing): Call set_target_expr_eliding. * typeck2.cc (replace_placeholders_for_class_temp_r): Don't use pset. (digest_nsdmi_init): Call cp_walk_tree_without_duplicates instead of cp_walk_tree. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/call.cc4
-rw-r--r--gcc/cp/typeck2.cc20
2 files changed, 8 insertions, 16 deletions
diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index 886760a..85536fc 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -9437,6 +9437,10 @@ convert_for_arg_passing (tree type, tree val, tsubst_flags_t complain)
if (complain & tf_warning)
warn_for_address_of_packed_member (type, val);
+ /* gimplify_arg elides TARGET_EXPRs that initialize a function argument. */
+ if (SIMPLE_TARGET_EXPR_P (val))
+ set_target_expr_eliding (val);
+
return val;
}
diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc
index 06bad4d..7782f38 100644
--- a/gcc/cp/typeck2.cc
+++ b/gcc/cp/typeck2.cc
@@ -1409,16 +1409,14 @@ digest_init_flags (tree type, tree init, int flags, tsubst_flags_t complain)
in the context of guaranteed copy elision). */
static tree
-replace_placeholders_for_class_temp_r (tree *tp, int *, void *data)
+replace_placeholders_for_class_temp_r (tree *tp, int *, void *)
{
tree t = *tp;
- auto pset = static_cast<hash_set<tree> *>(data);
/* We're looking for a TARGET_EXPR nested in the whole expression. */
if (TREE_CODE (t) == TARGET_EXPR
/* That serves as temporary materialization, not an initializer. */
- && !TARGET_EXPR_ELIDING_P (t)
- && !pset->add (t))
+ && !TARGET_EXPR_ELIDING_P (t))
{
tree init = TARGET_EXPR_INITIAL (t);
while (TREE_CODE (init) == COMPOUND_EXPR)
@@ -1433,16 +1431,6 @@ replace_placeholders_for_class_temp_r (tree *tp, int *, void *data)
gcc_checking_assert (!find_placeholders (init));
}
}
- /* TARGET_EXPRs initializing function arguments are not marked as eliding,
- even though gimplify_arg drops them on the floor. Don't go replacing
- placeholders in them. */
- else if (TREE_CODE (t) == CALL_EXPR || TREE_CODE (t) == AGGR_INIT_EXPR)
- for (int i = 0; i < call_expr_nargs (t); ++i)
- {
- tree arg = get_nth_callarg (t, i);
- if (TREE_CODE (arg) == TARGET_EXPR && !TARGET_EXPR_ELIDING_P (arg))
- pset->add (arg);
- }
return NULL_TREE;
}
@@ -1490,8 +1478,8 @@ digest_nsdmi_init (tree decl, tree init, tsubst_flags_t complain)
temporary materialization does not occur when initializing an object
from a prvalue of the same type, therefore we must not replace the
placeholder with a temporary object so that it can be elided. */
- hash_set<tree> pset;
- cp_walk_tree (&init, replace_placeholders_for_class_temp_r, &pset, nullptr);
+ cp_walk_tree_without_duplicates (&init, replace_placeholders_for_class_temp_r,
+ nullptr);
return init;
}