This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[3.3] C++ PATCH: Fix 15857
- From: Gabriel Dos Reis <gdr at integrable-solutions dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: 13 Sep 2004 10:40:04 +0200
- Subject: [3.3] C++ PATCH: Fix 15857
- Organization: Integrable Solutions
This backport from gcc-3_4-branch fixes PR c++/15857. It had been
coordinated with Jason, the original author for this patch to fix
c++/15461 in GCC-3.4.x and mainline.
Bootstrapped and regtested on an i686-pc-linux-gnu.
-- Gaby
Index: cp/ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/ChangeLog,v
retrieving revision 1.3076.2.272
diff -p -r1.3076.2.272 ChangeLog
*** cp/ChangeLog 24 Jul 2004 13:03:21 -0000 1.3076.2.272
--- cp/ChangeLog 13 Sep 2004 08:31:31 -0000
***************
*** 1,3 ****
--- 1,11 ----
+ 2004-09-13 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ Backport from gcc-3_4-branch
+ 2004-08-24 Jason Merrill <jason@redhat.com>
+ PR c++/15461
+ * semantics.c (nullify_returns_r): Replace a DECL_STMT
+ for the NRV with an INIT_EXPR.
+
2004-07-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/16175
Index: cp/semantics.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/semantics.c,v
retrieving revision 1.282.4.6
diff -p -r1.282.4.6 semantics.c
*** cp/semantics.c 6 Jul 2003 22:02:17 -0000 1.282.4.6
--- cp/semantics.c 13 Sep 2004 08:31:32 -0000
*************** nullify_returns_r (tp, walk_subtrees, da
*** 2457,2463 ****
else if (TREE_CODE (*tp) == CLEANUP_STMT
&& CLEANUP_DECL (*tp) == nrv)
CLEANUP_EH_ONLY (*tp) = 1;
!
/* Keep iterating. */
return NULL_TREE;
}
--- 2457,2484 ----
else if (TREE_CODE (*tp) == CLEANUP_STMT
&& CLEANUP_DECL (*tp) == nrv)
CLEANUP_EH_ONLY (*tp) = 1;
! /* Replace the DECL_STMT for the NRV with an initialization of the
! RESULT_DECL, if needed. */
! else if (TREE_CODE (*tp) == DECL_STMT
! && DECL_STMT_DECL (*tp) == nrv)
! {
! tree init;
! if (DECL_INITIAL (nrv)
! && DECL_INITIAL (nrv) != error_mark_node)
! {
! init = build (INIT_EXPR, void_type_node,
! DECL_RESULT (current_function_decl),
! DECL_INITIAL (nrv));
! DECL_INITIAL (nrv) = error_mark_node;
! }
! else
! init = NULL_TREE;
! init = build_stmt (EXPR_STMT, init);
! TREE_CHAIN (init) = TREE_CHAIN (*tp);
! STMT_LINENO (init) = STMT_LINENO (*tp);
! *tp = init;
! }
!
/* Keep iterating. */
return NULL_TREE;
}
Index: testsuite/g++.dg/opt/nrv7.C
===================================================================
RCS file: testsuite/g++.dg/opt/nrv7.C
diff -N testsuite/g++.dg/opt/nrv7.C
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/opt/nrv7.C 13 Sep 2004 08:31:33 -0000
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/15461
+
+ struct A {
+ int i;
+ };
+
+ inline A foo () {
+ int j = 1;
+ A a = { j };
+ return a;
+ }
+
+ A tv = foo();