]> gcc.gnu.org Git - gcc.git/commitdiff
re PR lto/53808 (Undefined symbol when building a library with lto)
authorJason Merrill <jason@redhat.com>
Tue, 25 Feb 2014 18:54:48 +0000 (13:54 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 25 Feb 2014 18:54:48 +0000 (13:54 -0500)
PR lto/53808
* class.c (clone_function_decl): Call note_vague_linkage_fn for
defaulted virtual dtor.

From-SVN: r208153

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

index 7f63b8ed1613b10a232b535d010fd074c125253f..393b213d87c6cb383797ddb51d51ec71645ab65f 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 97a1cc27855c144d7ea96593e9f50c46e2796fbe..e861e4d21e14e977a583517ff0fa7e2280a90147 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;
+}
This page took 0.076055 seconds and 5 git commands to generate.