diff options
author | Jason Merrill <jason@redhat.com> | 2015-06-16 15:29:09 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-06-16 15:29:09 -0400 |
commit | 2ed4c0297fb2ece975c69d17e02eac8d8b62325b (patch) | |
tree | d77d596beeabd917886f711d575dd0ddf4ed8cf2 /gcc/cp/tree.c | |
parent | bd93aa1a976dca96267efb36d6d909ff9813a414 (diff) | |
download | gcc-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.c | 23 |
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); |