aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/tree.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-06-16 15:29:09 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-06-16 15:29:09 -0400
commit2ed4c0297fb2ece975c69d17e02eac8d8b62325b (patch)
treed77d596beeabd917886f711d575dd0ddf4ed8cf2 /gcc/cp/tree.c
parentbd93aa1a976dca96267efb36d6d909ff9813a414 (diff)
downloadgcc-2ed4c0297fb2ece975c69d17e02eac8d8b62325b.zip
gcc-2ed4c0297fb2ece975c69d17e02eac8d8b62325b.tar.gz
gcc-2ed4c0297fb2ece975c69d17e02eac8d8b62325b.tar.bz2
re PR c++/58063 (default arguments evaluated twice per call)
PR c++/58063 * tree.c (bot_manip): Remap SAVE_EXPR. From-SVN: r224533
Diffstat (limited to 'gcc/cp/tree.c')
-rw-r--r--gcc/cp/tree.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 3553d7c..a52e6f4 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2423,6 +2423,29 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
*walk_subtrees = 0;
return NULL_TREE;
}
+ if (TREE_CODE (*tp) == SAVE_EXPR)
+ {
+ t = *tp;
+ splay_tree_node n = splay_tree_lookup (target_remap,
+ (splay_tree_key) t);
+ if (n)
+ {
+ *tp = (tree)n->value;
+ *walk_subtrees = 0;
+ }
+ else
+ {
+ copy_tree_r (tp, walk_subtrees, NULL);
+ splay_tree_insert (target_remap,
+ (splay_tree_key)t,
+ (splay_tree_value)*tp);
+ /* Make sure we don't remap an already-remapped SAVE_EXPR. */
+ splay_tree_insert (target_remap,
+ (splay_tree_key)*tp,
+ (splay_tree_value)*tp);
+ }
+ return NULL_TREE;
+ }
/* Make a copy of this node. */
t = copy_tree_r (tp, walk_subtrees, NULL);