PR lto/53808
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Feb 2014 18:54:48 +0000 (18:54 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Feb 2014 18:54:48 +0000 (18:54 +0000)
* class.c (clone_function_decl): Call note_vague_linkage_fn for
defaulted virtual dtor.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208153 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 7f63b8e..393b213 100644 (file)
@@ -1,5 +1,9 @@
 2014-02-25  Jason Merrill  <jason@redhat.com>
 
+       PR lto/53808
+       * class.c (clone_function_decl): Call note_vague_linkage_fn for
+       defaulted virtual dtor.
+
        DR 1286
        PR c++/60328
        * pt.c (get_underlying_template): Fix equivalence calculation.
index 97a1cc2..e861e4d 100644 (file)
@@ -4582,6 +4582,10 @@ 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);
diff --git a/gcc/testsuite/g++.dg/opt/devirt4.C b/gcc/testsuite/g++.dg/opt/devirt4.C
new file mode 100644 (file)
index 0000000..5a24eec
--- /dev/null
@@ -0,0 +1,16 @@
+// PR lto/53808
+// Devirtualization + inlining should produce a non-virtual
+// call to ~foo.
+// { dg-options "-O -fdevirtualize" }
+// { dg-final { scan-assembler "_ZN3fooD2Ev" } }
+
+struct foo {
+ virtual ~foo();
+};
+struct bar : public foo {
+ virtual void zed();
+};
+void f() {
+ foo *x(new bar);
+ delete x;
+}