From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7255 invoked by alias); 18 Apr 2002 13:46:12 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 7194 invoked by uid 71); 18 Apr 2002 13:46:07 -0000 Date: Thu, 18 Apr 2002 06:46:00 -0000 Message-ID: <20020418134607.7188.qmail@sources.redhat.com> To: rth@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Jason Merrill Subject: Re: c++/5504: Optimization breaks wei-ku-1 from blitz Reply-To: Jason Merrill X-SW-Source: 2002-04/txt/msg00928.txt.bz2 List-Id: The following reply was made to PR c++/5504; it has been noted by GNATS. From: Jason Merrill To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/5504: Optimization breaks wei-ku-1 from blitz Date: Thu, 18 Apr 2002 14:39:37 +0100 Here's an unofficial patch which returns us to running destructor base cleanups by hand, breaking semantics for an exception thrown in the destructor body. I'm not applying this anywhere, but you might find it useful. 2002-04-18 Jason Merrill * init.c (push_base_cleanups): Rename to perform_base_cleanups. Expand base cleanups now rather than pushing them. * decl.c (begin_destructor_body): Don't call push_base_cleanups. (finish_destructor_body): Call perform_base_cleanups. * cp-tree.h: Adjust prototype. *** cp-tree.h.~1~ Fri Apr 12 12:43:31 2002 --- cp-tree.h Tue Apr 9 01:56:51 2002 *************** extern tree build_new PARAMS ((tree, *** 3907,3913 **** extern tree build_vec_init PARAMS ((tree, tree, int)); extern tree build_x_delete PARAMS ((tree, int, tree)); extern tree build_delete PARAMS ((tree, tree, special_function_kind, int, int)); ! extern void push_base_cleanups PARAMS ((void)); extern tree build_vbase_delete PARAMS ((tree, tree)); extern tree build_vec_delete PARAMS ((tree, tree, special_function_kind, int)); extern tree create_temporary_var PARAMS ((tree)); --- 3907,3913 ---- extern tree build_vec_init PARAMS ((tree, tree, int)); extern tree build_x_delete PARAMS ((tree, int, tree)); extern tree build_delete PARAMS ((tree, tree, special_function_kind, int, int)); ! extern void perform_base_cleanups PARAMS ((void)); extern tree build_vbase_delete PARAMS ((tree, tree)); extern tree build_vec_delete PARAMS ((tree, tree, special_function_kind, int)); extern tree create_temporary_var PARAMS ((tree)); *** decl.c.~1~ Fri Apr 12 12:43:31 2002 --- decl.c Fri Apr 12 11:59:12 2002 *************** begin_destructor_body () *** 14064,14073 **** finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); finish_then_clause (if_stmt); finish_if_stmt (); - - /* And insert cleanups for our bases and members so that they - will be properly destroyed if we throw. */ - push_base_cleanups (); } /* At the end of every destructor we generate code to delete the object if --- 14064,14069 ---- *************** finish_destructor_body () *** 14078,14083 **** --- 14074,14082 ---- { tree exprstmt; + /* And perform cleanups for our bases and members. */ + perform_base_cleanups (); + /* In a virtual destructor, we must call delete. */ if (DECL_VIRTUAL_P (current_function_decl)) { *** init.c.~1~ Fri Apr 12 12:43:31 2002 --- init.c Fri Apr 5 23:38:24 2002 *************** build_delete (type, addr, auto_delete, f *** 3218,3230 **** } } ! /* At the beginning of a destructor, push cleanups that will call the ! destructors for our base classes and members. ! Called from setup_vtbl_ptr. */ void ! push_base_cleanups () { tree binfos; int i, n_baseclasses; --- 3218,3230 ---- } } ! /* At the end of a destructor, call the destructors for our base classes ! and members. ! Called from finish_destructor_body. */ void ! perform_base_cleanups () { tree binfos; int i, n_baseclasses; *************** push_base_cleanups () *** 3268,3274 **** LOOKUP_NORMAL); expr = build (COND_EXPR, void_type_node, cond, expr, void_zero_node); ! finish_decl_cleanup (NULL_TREE, expr); } } } --- 3268,3274 ---- LOOKUP_NORMAL); expr = build (COND_EXPR, void_type_node, cond, expr, void_zero_node); ! finish_expr_stmt (expr); } } } *************** push_base_cleanups () *** 3288,3294 **** base_dtor_identifier, NULL_TREE); ! finish_decl_cleanup (NULL_TREE, expr); } for (member = TYPE_FIELDS (current_class_type); member; --- 3288,3294 ---- base_dtor_identifier, NULL_TREE); ! finish_expr_stmt (expr); } for (member = TYPE_FIELDS (current_class_type); member; *************** push_base_cleanups () *** 3306,3312 **** sfk_complete_destructor, LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, 0); ! finish_decl_cleanup (NULL_TREE, expr); } } } --- 3306,3312 ---- sfk_complete_destructor, LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, 0); ! finish_expr_stmt (expr); } } }