C++ PATCH: Fix PR 10300

Mark Mitchell mark@codesourcery.com
Sun Apr 13 17:50:00 GMT 2003


This patch fixes PR c++/10300 on the 3.3 branch.  I'm preparing a
different, more intrusive, patch for the mainline.

Tested on i686-pc-linux-gnu, applied on the branch.

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com

2003-04-13  Mark Mitchell  <mark@codesourcery.com>

	PR c++/10300
	* g++.dg/init/new5.C: New test.

2003-04-13  Mark Mitchell  <mark@codesourcery.com>

	PR c++/10300
	* init.c (build_new_1): Correct logic for checking whether the
	return value from the allocation function was zero.

Index: cp/init.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/init.c,v
retrieving revision 1.299.2.4
diff -c -5 -p -r1.299.2.4 init.c
*** cp/init.c	17 Mar 2003 12:00:24 -0000	1.299.2.4
--- cp/init.c	13 Apr 2003 17:45:50 -0000
*************** build_new_1 (exp)
*** 2501,2512 ****
      rval = TREE_OPERAND (alloc_expr, 1);
    else
      {
        if (check_new)
  	{
! 	  tree ifexp = cp_build_binary_op (NE_EXPR, alloc_node,
! 					   integer_zero_node);
  	  rval = build_conditional_expr (ifexp, rval, alloc_node);
  	}
  
        rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
      }
--- 2501,2516 ----
      rval = TREE_OPERAND (alloc_expr, 1);
    else
      {
        if (check_new)
  	{
! 	  tree null_node;
! 	  tree ifexp;
! 
! 	  null_node = convert (TREE_TYPE (alloc_node),
! 			       cookie_size ? cookie_size : size_zero_node);
! 	  ifexp = cp_build_binary_op (NE_EXPR, alloc_node, null_node);
  	  rval = build_conditional_expr (ifexp, rval, alloc_node);
  	}
  
        rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
      }
Index: testsuite/g++.dg/init/new5.C
===================================================================
RCS file: testsuite/g++.dg/init/new5.C
diff -N testsuite/g++.dg/init/new5.C
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/init/new5.C	13 Apr 2003 17:45:55 -0000
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run }
+ 
+ #include <new>
+     
+ void * operator new[](size_t, std::nothrow_t const &) throw()
+ { return NULL; }
+ 
+ struct X {
+     struct Inner { ~Inner() {} };
+ 
+     X() {
+       Inner * ic = new (std::nothrow) Inner[1]; // SegFault here
+     }
+ };
+ 
+ int main() {
+    X table;
+ }



More information about the Gcc-patches mailing list