From d74db8ff1c8f126c3d45ab9e72458ead0422865b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 26 Mar 2014 12:50:26 -0400 Subject: re PR c++/60566 (r208573 omits needed thunks) PR c++/60566 PR c++/58678 * class.c (build_vtbl_initializer): Handle abstract dtors here. * search.c (get_pure_virtuals): Not here. From-SVN: r208845 --- gcc/cp/class.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'gcc/cp/class.c') diff --git a/gcc/cp/class.c b/gcc/cp/class.c index b46391b..d277e07 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -9017,6 +9017,16 @@ build_vtbl_initializer (tree binfo, if (!TARGET_VTABLE_USES_DESCRIPTORS) init = fold_convert (vfunc_ptr_type_node, build_fold_addr_expr (fn)); + /* Don't refer to a virtual destructor from a constructor + vtable or a vtable for an abstract class, since destroying + an object under construction is undefined behavior and we + don't want it to be considered a candidate for speculative + devirtualization. But do create the thunk for ABI + compliance. */ + if (DECL_DESTRUCTOR_P (fn_original) + && (CLASSTYPE_PURE_VIRTUALS (DECL_CONTEXT (fn_original)) + || orig_binfo != binfo)) + init = size_zero_node; } } -- cgit v1.1