]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60347 (r208153 breaks Firefox build)
authorJason Merrill <jason@redhat.com>
Wed, 26 Feb 2014 21:32:41 +0000 (16:32 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 26 Feb 2014 21:32:41 +0000 (16:32 -0500)
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.

From-SVN: r208184

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/init.c
gcc/testsuite/g++.dg/template/dtor9.C [new file with mode: 0644]

index 41a0db6e13da9204ce7c33f7394b6a1c43d47f7b..1f35d2a5909aa1c52f793d97a9a5cdf1ed876be4 100644 (file)
@@ -1,5 +1,10 @@
 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
index f61dc9d29dfb29e685874c29fae77aba99d8f62a..b46391be1552cb763fec3103690b06afc00f7c67 100644 (file)
@@ -4584,10 +4584,6 @@ clone_function_decl (tree fn, int update_method_vec_p)
         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);
index 194a79777f4754298587d3d727fe37d90780acfd..3ae2b5c619273d19c306f4bb581cd3334a4ebcd8 100644 (file)
@@ -1123,7 +1123,13 @@ build_vtbl_address (tree binfo)
   /* 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));
diff --git a/gcc/testsuite/g++.dg/template/dtor9.C b/gcc/testsuite/g++.dg/template/dtor9.C
new file mode 100644 (file)
index 0000000..fd71389
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/60347
+
+struct A;
+
+template <class T>
+struct B
+{
+  T* p;
+  virtual ~B() { p->~T(); }
+};
+
+struct C: B<A> { };