diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f8936b6ed8d..9045196e444 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +1999-12-26 Mark Mitchell + + * 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 * semantics.c (expand_body): Use diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index db44737cc13..f8c473f1c3f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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)); } } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d55ee152b86..efcfc1aeaad 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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 diff --git a/gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C b/gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C index 377f9f3564c..88bc4666f5b 100644 --- a/gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C +++ b/gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C @@ -1,3 +1,4 @@ +// Build don't link: // Copyright (C) 1999 Free Software Foundation // by Alexandre Oliva @@ -5,7 +6,6 @@ // distilled from libg++'s Rational.cc // Special g++ Options: -// crash test - XFAIL sparc64*-*-* sparcv9*-*-* alpha*-*-* inline int bar () return r {} diff --git a/gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C b/gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C index c3f77b48638..3a69edfe735 100644 --- a/gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C +++ b/gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C @@ -1,3 +1,4 @@ +// Build don't link: // Copyright (C) 1999 Free Software Foundation // by Alexandre Oliva @@ -11,4 +12,4 @@ inline int bar () return r {} int& foo (int& x) { bar (); return x; -} // gets bogus error - XFAIL *-*-* +}