🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.g++.bug
Article #1844

Overloaded delete operator bug

#1844
From: Michael Tiemann
Date: Mon, 10 Apr 1989 16:26
76 lines
2962 bytes
Here is a fix for GNU C++ wrt overloading operator delete.  Your line
numbers will vary.

yahi% diff -c2 cplus-init.c~ cplus-init.c
*** cplus-init.c~	Sun Apr  2 04:03:25 1989
--- cplus-init.c	Mon Apr 10 09:20:40 1989
***************
*** 2600,2603 ****
--- 2604,2608 ----
        tree exprstmt = NULL_TREE;
        tree parent_auto_delete = auto_delete;
+       tree cond;
  
        /* If this type does not have a destructor, but does have
***************
*** 2608,2616 ****
  	{
  	  parent_auto_delete = integer_zero_node;
! 	  expr = build_opfncall (DELETE_EXPR, addr, addr);
! 	  if (expr == error_mark_node)
! 	    return error_mark_node;
! 	  exprstmt = build_tree_list (NULL_TREE, expr);
  	}
  
        if (basetype && TYPE_NEEDS_DESTRUCTOR (basetype))
--- 2613,2641 ----
  	{
  	  parent_auto_delete = integer_zero_node;
! 	  if (auto_delete == integer_zero_node)
! 	    cond = NULL_TREE;
! 	  else
! 	    {
! 	      expr = build_opfncall (DELETE_EXPR, addr, addr);
! 	      if (expr == error_mark_node)
! 		return error_mark_node;
! 	      if (auto_delete != integer_one_node)
! 		cond = build (COND_EXPR, void_type_node,
! 			      build (NE_EXPR, integer_type_node, auto_delete, integer_zero_node),
! 			      expr,
! 			      build (NOP_EXPR, void_type_node, integer_zero_node));
! 	      else cond = expr;
! 	    }
! 	}
!       else if (basetype == NULL_TREE
! 	       || ! TYPE_NEEDS_DESTRUCTOR (basetype))
! 	{
! 	  cond = build (COND_EXPR, void_type_node,
! 			build (NE_EXPR, integer_type_node, auto_delete, integer_zero_node),
! 			build_function_call (BID, build_tree_list (NULL_TREE, addr)),
! 			build (NOP_EXPR, void_type_node, integer_zero_node));
  	}
+       if (cond)
+ 	exprstmt = build_tree_list (NULL_TREE, cond);
  
        if (basetype && TYPE_NEEDS_DESTRUCTOR (basetype))
***************
*** 2625,2639 ****
  				  exprstmt);
  	}
-       else
- 	{
- 	  tree cond = build (COND_EXPR, void_type_node,
- 			     build (NE_EXPR, integer_type_node, auto_delete, integer_zero_node),
- 			     (TREE_GETS_DELETE (type)
- 			      ? build_opfncall (DELETE_EXPR, addr, addr)
- 			      : build_function_call (BID, build_tree_list (NULL_TREE, addr))),
- 			     build (NOP_EXPR, void_type_node, integer_zero_node));
- 
- 	  exprstmt = build_tree_list (NULL_TREE, cond);
- 	}
  
        for (i = 2; i <= n_baseclasses; i++)
--- 2650,2653 ----


Michael
Technical Details
Message-ID: <8904101626.AA24379@yahi.stanford.edu>
Path: arc1-ca.pugleaf.net!utzoo!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!YAHI.STANFORD.EDU!tiemann
References: <AA26080.8904101226.snipe@uk.ac.newcastle>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!YAHI.STANFORD.EDU!tiemann
From: tiemann@YAHI.STANFORD.EDU (Michael Tiemann)
Newsgroups: gnu.g++.bug
Subject: Overloaded delete operator bug
Message-ID: <8904101626.AA24379@yahi.stanford.edu>
Date: 10 Apr 89 16:26:39 GMT
References: <AA26080.8904101226.snipe@uk.ac.newcastle>
Sender: daemon@tut.cis.ohio-state.edu
Reply-To: tiemann@lurch.stanford.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 76