[gnu.g++.bug] fix for operator delete bug

jjc@UUNET.UU.NET (James Clark) (04/28/89)

The following patch seems to fix the problem that I reported with
objects' getting deleted twice.

*** cplus-init.c.distrib	Thu Apr 27 18:37:26 1989
--- cplus-init.c	Thu Apr 27 19:09:11 1989
***************
*** 2607,2613 ****
        if (TREE_GETS_DELETE (type))
  	{
  	  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);
--- 2607,2617 ----
        if (TREE_GETS_DELETE (type))
  	{
  	  parent_auto_delete = integer_zero_node;
! 	  expr = build (COND_EXPR, void_type_node,
! 			build (NE_EXPR, integer_type_node, auto_delete, integer_zero_node),
! 			build_opfncall (DELETE_EXPR, addr, addr),
! 			build (NOP_EXPR, void_type_node, integer_zero_node));
! 
  	  if (expr == error_mark_node)
  	    return error_mark_node;
  	  exprstmt = build_tree_list (NULL_TREE, expr);

Here's an illustration of the problem:

Script started on Thu Apr 27 19:06:18 1989
jclark% cat delete.c
#include <stdio.h>


struct A {
  virtual ~A() {}
  operator delete(void *p) { fprintf(stderr, "A::operator delete(%d)\n", p); }
};

struct B : A {
};

struct C : B {
  ~C() {}
};


main()
{
  A *a = new C;
  delete a;
}
jclark% g++ -g -v delete.c
g++ version 1.34.1
 /usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ delete.c /tmp/cca03921.cpp
GNU CPP version 1.34
 /usr/local/lib/gcc-c++ /tmp/cca03921.cpp -quiet -dumpbase delete.c -g -version -o /tmp/cca03921.s
GNU C++ version 1.34.1 (sparc) compiled by GNU C version 1.34.
 as /tmp/cca03921.s -o delete.o
 /usr/local/lib/gcc-ld++ -C -e start -dc -dp -Bstatic /usr/local/lib/crt0+.o delete.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc
jclark% a.out
A::operator delete(43048)
A::operator delete(43048)
jclark% exit
jclark% 
script done on Thu Apr 27 19:07:04 1989

James Clark
jjc@jclark.uucp