Path: utzoo!utgpu!watmath!uunet!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: Sender: daemon@tut.cis.ohio-state.edu Reply-To: tiemann@lurch.stanford.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 76 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