2014-02-26 Jason Merrill <jason@redhat.com>
+ PR c++/60347
+ PR lto/53808
+ * class.c (clone_function_decl): Don't note_vague_linkage_fn.
+ * init.c (build_vtbl_address): Do it here.
+
PR c++/59231
PR c++/11586
PR c++/14710
destructor. */
if (DECL_VIRTUAL_P (fn))
{
- if (DECL_DEFAULTED_FN (fn) && flag_devirtualize)
- /* Make sure the destructor gets synthesized so that it can be
- inlined after devirtualization. */
- note_vague_linkage_fn (fn);
clone = build_clone (fn, deleting_dtor_identifier);
if (update_method_vec_p)
add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
/* Figure out what vtable BINFO's vtable is based on, and mark it as
used. */
vtbl = get_vtbl_decl_for_binfo (binfo_for);
- TREE_USED (vtbl) = 1;
+ if (tree dtor = CLASSTYPE_DESTRUCTORS (DECL_CONTEXT (vtbl)))
+ if (!TREE_USED (vtbl) && DECL_VIRTUAL_P (dtor) && DECL_DEFAULTED_FN (dtor))
+ /* Make sure the destructor gets synthesized so that it can be
+ inlined after devirtualization even if the vtable is never
+ emitted. */
+ note_vague_linkage_fn (dtor);
+ TREE_USED (vtbl) = true;
/* Now compute the address to use when initializing the vptr. */
vtbl = unshare_expr (BINFO_VTABLE (binfo_for));