* decl.c (store_return_init): Use mode of old RTL generated for
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Dec 1999 15:28:18 +0000 (15:28 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Dec 1999 15:28:18 +0000 (15:28 +0000)
DECL_RESULT, not the mode of DECL_RESULT itself.
* semantics.c (finish_named_return_value): Set DECL_UNINLINABLE
for functions that used named return values.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31092 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/semantics.c
gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C
gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C

index f8936b6..9045196 100644 (file)
@@ -1,3 +1,10 @@
+1999-12-26  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl.c (store_return_init): Use mode of old RTL generated for
+       DECL_RESULT, not the mode of DECL_RESULT itself.
+       * semantics.c (finish_named_return_value): Set DECL_UNINLINABLE
+       for functions that used named return values.
+       
 1999-12-24  Mark Mitchell  <mark@codesourcery.com>
 
        * semantics.c (expand_body): Use
index db44737..f8c473f 100644 (file)
@@ -13445,7 +13445,14 @@ store_return_init (decl)
   if (DECL_REGISTER (decl))
     {
       original_result_rtx = DECL_RTL (decl);
-      DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
+      /* Note that the mode of the old DECL_RTL may be wider than the
+        mode of DECL_RESULT, depending on the calling conventions for
+        the processor.  For example, on the Alpha, a 32-bit integer
+        is returned in a DImode register -- the DECL_RESULT has
+        SImode but the DECL_RTL for the DECL_RESULT has DImode.  So,
+        here, we use the mode the back-end has already assigned for
+        the return value.  */
+      DECL_RTL (decl) = gen_reg_rtx (GET_MODE (original_result_rtx));
     }
 }
 
index d55ee15..efcfc1a 100644 (file)
@@ -1203,6 +1203,11 @@ finish_named_return_value (return_id, init)
          store_return_init (decl);
        }
     }
+
+  /* Don't use tree-inlining for functions with named return values.
+     That doesn't work properly because we don't do any translation of
+     the RETURN_INITs when they are copied.  */
+  DECL_UNINLINABLE (current_function_decl) = 1;
 }
 
 /* Cache the value of this class's main virtual function table pointer
index 377f9f3..88bc466 100644 (file)
@@ -1,3 +1,4 @@
+// Build don't link:
 // Copyright (C) 1999 Free Software Foundation
 
 // by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
@@ -5,7 +6,6 @@
 // distilled from libg++'s Rational.cc
 
 // Special g++ Options:
-// crash test - XFAIL sparc64*-*-* sparcv9*-*-* alpha*-*-*
 
 inline int bar () return r {}
 
index c3f77b4..3a69edf 100644 (file)
@@ -1,3 +1,4 @@
+// Build don't link:
 // Copyright (C) 1999 Free Software Foundation
 
 // by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
@@ -11,4 +12,4 @@ inline int bar () return r {}
 int& foo (int& x) {
   bar ();
   return x;
-} // gets bogus error - XFAIL *-*-*
+}