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