From a4d25b444ddd3e7bede9de07530116456b9e69a8 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 20 Sep 2011 15:37:57 -0400 Subject: [PATCH] call.c (convert_default_arg): Avoid redundant copy. * call.c (convert_default_arg): Avoid redundant copy. * tree.c (bot_manip): Copy everything. From-SVN: r179016 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 10 ++-------- gcc/cp/tree.c | 12 ++++++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b85e16c3eb0..da3f491c66e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-09-20 Jason Merrill + + * call.c (convert_default_arg): Avoid redundant copy. + * tree.c (bot_manip): Copy everything. + 2011-09-20 Roberto Agostino Vitillo * call.c (build_new_method_call_1): Use non-virtual lookup diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 873b48b32b5..b616cffde5d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6130,6 +6130,8 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum) we must not perform access checks here. */ push_deferring_access_checks (dk_no_check); + /* We must make a copy of ARG, in case subsequent processing + alters any part of it. */ arg = break_out_target_exprs (arg); if (TREE_CODE (arg) == CONSTRUCTOR) { @@ -6140,14 +6142,6 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum) } else { - /* We must make a copy of ARG, in case subsequent processing - alters any part of it. For example, during gimplification a - cast of the form (T) &X::f (where "f" is a member function) - will lead to replacing the PTRMEM_CST for &X::f with a - VAR_DECL. We can avoid the copy for constants, since they - are never modified in place. */ - if (!CONSTANT_CLASS_P (arg)) - arg = unshare_expr (arg); arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT, ICR_DEFAULT_ARGUMENT, fn, parmnum, tf_warning_or_error); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 998795302c3..a9e1a26200e 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1865,9 +1865,13 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) if (!TYPE_P (t) && TREE_CONSTANT (t) && !TREE_SIDE_EFFECTS (t)) { - /* There can't be any TARGET_EXPRs or their slot variables below - this point. */ + /* There can't be any TARGET_EXPRs or their slot variables below this + point. But we must make a copy, in case subsequent processing + alters any part of it. For example, during gimplification a cast + of the form (T) &X::f (where "f" is a member function) will lead + to replacing the PTRMEM_CST for &X::f with a VAR_DECL. */ *walk_subtrees = 0; + *tp = unshare_expr (t); return NULL_TREE; } if (TREE_CODE (t) == TARGET_EXPR) @@ -1928,8 +1932,8 @@ bot_replace (tree* t, /* When we parse a default argument expression, we may create temporary variables via TARGET_EXPRs. When we actually use the - default-argument expression, we make a copy of the expression, but - we must replace the temporaries with appropriate local versions. */ + default-argument expression, we make a copy of the expression + and replace the temporaries with appropriate local versions. */ tree break_out_target_exprs (tree t) -- 2.30.2