aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-12-14 18:52:40 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-12-14 18:52:40 +0000
commitd7d5e42f2d03fb95b70b605a9c9a0488e0e1ba74 (patch)
treebca049f0a1dd3cb2de3afa255b36071c10242069 /gcc
parent89c6e7ac34e495615ffe46106e955831a723970f (diff)
downloadgcc-d7d5e42f2d03fb95b70b605a9c9a0488e0e1ba74.zip
gcc-d7d5e42f2d03fb95b70b605a9c9a0488e0e1ba74.tar.gz
gcc-d7d5e42f2d03fb95b70b605a9c9a0488e0e1ba74.tar.bz2
cp-tree.h (remap_save_expr): Add walk_subtrees parameter.
* cp-tree.h (remap_save_expr): Add walk_subtrees parameter. * optimize.c (copy_body_r): Pass it. * tree.c (remap_save_expr): Clear walk_subtrees for an already-handled SAVE_EXPR. (cp_unsave_r): Pass walk_subtrees to remap_save_expr. From-SVN: r30926
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/optimize.c3
-rw-r--r--gcc/cp/tree.c9
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/inline3.C51
5 files changed, 67 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3f44c78..31b963e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
1999-12-14 Mark Mitchell <mark@codesourcery.com>
+ * cp-tree.h (remap_save_expr): Add walk_subtrees parameter.
+ * optimize.c (copy_body_r): Pass it.
+ * tree.c (remap_save_expr): Clear walk_subtrees for an
+ already-handled SAVE_EXPR.
+ (cp_unsave_r): Pass walk_subtrees to remap_save_expr.
+
* dump.c (dequeue_and_dump): Dump DECL_NAMESPACE_ALIAS.
* ir.texi (DECL_NAMESPACE_ALIAS): Document it.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 90f652f..99b2580 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4064,7 +4064,7 @@ extern tree copy_tree_r PROTO((tree *, int *, void *));
extern int cp_valid_lang_attribute PROTO((tree, tree, tree, tree));
extern tree make_ptrmem_cst PROTO((tree, tree));
extern tree cp_build_qualified_type_real PROTO((tree, int, int));
-extern void remap_save_expr PROTO((tree *, splay_tree, tree));
+extern void remap_save_expr PROTO((tree *, splay_tree, tree, int *));
#define cp_build_qualified_type(TYPE, QUALS) \
cp_build_qualified_type_real ((TYPE), (QUALS), /*complain=*/1)
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index ee33886..50ee83e 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -296,7 +296,8 @@ copy_body_r (tp, walk_subtrees, data)
*tp = new_decl;
}
else if (TREE_CODE (*tp) == SAVE_EXPR)
- remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0));
+ remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
+ walk_subtrees);
else if (TREE_CODE (*tp) == UNSAVE_EXPR)
my_friendly_abort (19991113);
/* For a SCOPE_STMT, we must copy the associated block so that we
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 31fbec0..c66d2fb 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2659,10 +2659,11 @@ init_tree ()
ST. FN is the function into which the copy will be placed. */
void
-remap_save_expr (tp, st, fn)
+remap_save_expr (tp, st, fn, walk_subtrees)
tree *tp;
splay_tree st;
tree fn;
+ int *walk_subtrees;
{
splay_tree_node n;
@@ -2684,6 +2685,10 @@ remap_save_expr (tp, st, fn)
(splay_tree_key) *tp,
(splay_tree_value) t);
}
+ else
+ /* We've already walked into this SAVE_EXPR, so we needn't do it
+ again. */
+ *walk_subtrees = 0;
/* Replace this SAVE_EXPR with the copy. */
*tp = (tree) n->value;
@@ -2751,7 +2756,7 @@ cp_unsave_r (tp, walk_subtrees, data)
*tp = (tree) n->value;
}
else if (TREE_CODE (*tp) == SAVE_EXPR)
- remap_save_expr (tp, st, current_function_decl);
+ remap_save_expr (tp, st, current_function_decl, walk_subtrees);
else
{
copy_tree_r (tp, walk_subtrees, NULL);
diff --git a/gcc/testsuite/g++.old-deja/g++.other/inline3.C b/gcc/testsuite/g++.old-deja/g++.other/inline3.C
new file mode 100644
index 0000000..ec3b33a
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/inline3.C
@@ -0,0 +1,51 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+// Special g++ Options: -O3
+
+class ostream;
+
+struct S
+{
+ virtual void print(ostream&) const = 0;
+};
+
+template <class _Tp>
+class vector
+{
+public:
+ _Tp& operator[](unsigned __n) const { return *(_M_start + __n); }
+ _Tp* _M_start;
+};
+
+class T
+{
+public:
+
+ void print(ostream&) const;
+
+ vector<S*> bcList_m;
+};
+
+void T::print(ostream& o) const
+{
+ int n = 3;
+
+ for (int i = 0; i < n; ++i)
+ bcList_m[i]->print(o);
+ return;
+}
+
+ostream&
+operator<<(ostream& o, const T& bcList)
+{
+ bcList.print(o);
+ return o;
+}
+
+
+
+
+
+
+
+