]> gcc.gnu.org Git - gcc.git/commitdiff
optimize.c (copy_body_r): Clear the operand three of a TARGET_EXPR when copying it.
authorMark Mitchell <mark@codesourcery.com>
Sat, 15 Jan 2000 04:36:04 +0000 (04:36 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sat, 15 Jan 2000 04:36:04 +0000 (04:36 +0000)
* optimize.c (copy_body_r): Clear the operand three of a
TARGET_EXPR when copying it.

From-SVN: r31435

gcc/cp/ChangeLog
gcc/cp/optimize.c
gcc/testsuite/g++.old-deja/g++.other/inline5.C [new file with mode: 0644]

index 619d94c5c83655062596afb5d0a26da8303e6408..372f618a46a776360bc13852dbf174d045db259d 100644 (file)
@@ -1,3 +1,8 @@
+2000-01-14  Mark Mitchell  <mark@codesourcery.com>
+
+       * optimize.c (copy_body_r): Clear the operand three of a
+       TARGET_EXPR when copying it.
+
 2000-01-14  Martin v. Löwis  <loewis@informatik.hu-berlin.de>
 
        * method.c (build_decl_overload_real): Check whether we are in ::
index 2dd151ccb010bcbc0bc933ec39e7d3ae961e01cc..f529e9d70a6821e83831d0a26cf95efc798fe84e 100644 (file)
@@ -1,6 +1,6 @@
 /* Perform optimizations on tree structure.
 
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
    Written by Mark Michell (mark@codesourcery.com).
 
    This file is part of GNU CC.
@@ -285,6 +285,9 @@ copy_body_r (tp, walk_subtrees, data)
       /* Replace this variable with the copy.  */
       *tp = new_decl;
     }
+  else if (nonstatic_local_decl_p (*tp) 
+          && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
+    my_friendly_abort (0);
   else if (TREE_CODE (*tp) == SAVE_EXPR)
     remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0), 
                     walk_subtrees);
@@ -303,7 +306,10 @@ copy_body_r (tp, walk_subtrees, data)
       /* The copied TARGET_EXPR has never been expanded, even if the
         original node was expanded already.  */
       if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
-       TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
+       {
+         TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
+         TREE_OPERAND (*tp, 3) = NULL_TREE;
+       }
       /* Similarly, if we're copying a CALL_EXPR, the RTL for the
         result is no longer valid.  */
       else if (TREE_CODE (*tp) == CALL_EXPR)
diff --git a/gcc/testsuite/g++.old-deja/g++.other/inline5.C b/gcc/testsuite/g++.old-deja/g++.other/inline5.C
new file mode 100644 (file)
index 0000000..305fd0a
--- /dev/null
@@ -0,0 +1,30 @@
+// Build don't link:
+// Origin: Matt Austern <austern@isolde.engr.sgi.com>
+// Special g++ Options: -O2
+
+class X;
+
+extern X* tab1;
+
+struct Y {
+  explicit Y(int);
+};
+
+void* x ();
+
+Y k (void *);
+
+inline void f() { k (x ()); }
+
+inline void* x () 
+{
+  return 0;
+}
+
+static void g() {
+  f();
+}
+
+static void h() {
+  f();
+}
This page took 0.0875 seconds and 5 git commands to generate.