[3.3] C++ PATCH: Fix 15857

Gabriel Dos Reis gdr@integrable-solutions.net
Mon Sep 13 09:13:00 GMT 2004


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();



More information about the Gcc-patches mailing list