OSDN Git Service

PR c++/42256
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Dec 2009 08:03:36 +0000 (08:03 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Dec 2009 08:03:36 +0000 (08:03 +0000)
* optimize.c (maybe_clone_body): Call emit_associated_thunks
after expand_or_defer_fn_1.

* g++.dg/inherit/thunk11.C: New test.
* g++.dg/inherit/thunk11.h: New file.
* g++.dg/inherit/thunk11-aux.cc: New file.

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

gcc/cp/ChangeLog
gcc/cp/optimize.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/thunk11-aux.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/inherit/thunk11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/inherit/thunk11.h [new file with mode: 0644]

index 84ce5a5..6753829 100644 (file)
@@ -1,3 +1,9 @@
+2009-12-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/42256
+       * optimize.c (maybe_clone_body): Call emit_associated_thunks
+       after expand_or_defer_fn_1.
+
 2009-12-02  Taras Glek  <taras@mozilla.com>
 
        * parser.c (cp_parser_class_specifier): Back out my previous change.
index 5a67431..9210a80 100644 (file)
@@ -309,7 +309,6 @@ maybe_clone_body (tree fn)
              comdat_group = cdtor_comdat_group (fns[1], fns[0]);
              DECL_COMDAT_GROUP (fns[0]) = comdat_group;
            }
-         emit_associated_thunks (clone);
        }
 
       /* Build the delete destructor by calling complete destructor
@@ -383,7 +382,10 @@ maybe_clone_body (tree fn)
       finish_function (0);
       BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn);
       if (alias)
-       expand_or_defer_fn_1 (clone);
+       {
+         if (expand_or_defer_fn_1 (clone))
+           emit_associated_thunks (clone);
+       }
       else
        expand_or_defer_fn (clone);
       first = false;
index dab89fa..aeb92ac 100644 (file)
@@ -1,3 +1,10 @@
+2009-12-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/42256
+       * g++.dg/inherit/thunk11.C: New test.
+       * g++.dg/inherit/thunk11.h: New file.
+       * g++.dg/inherit/thunk11-aux.cc: New file.
+
 2009-12-02  Richard Guenther  <rguenther@suse.de>
 
        * g++.dg/ipa/iinline-1.C: Adjust.
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc b/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
new file mode 100644 (file)
index 0000000..7009d6c
--- /dev/null
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.C b/gcc/testsuite/g++.dg/inherit/thunk11.C
new file mode 100644 (file)
index 0000000..6e3bc32
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/42256
+// { dg-do link }
+// { dg-additional-sources "thunk11-aux.cc" }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
+
+int
+main ()
+{
+}
diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.h b/gcc/testsuite/g++.dg/inherit/thunk11.h
new file mode 100644 (file)
index 0000000..641f40e
--- /dev/null
@@ -0,0 +1,16 @@
+struct A
+{
+  A () {}
+  virtual ~A () {}
+};
+struct B
+{
+  B () {}
+  virtual ~B () {}
+};
+struct C : public A, public B
+{
+  virtual void foo ();
+  virtual ~C () {};
+};
+inline void C::foo () {}