+ PR c++/51928 + * class.c (set_method_tm_attributes): Use TARGET_THUNK instead...
authorAldy Hernandez <aldyh@redhat.com>
Tue, 24 Jan 2012 16:47:24 +0000 (16:47 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Tue, 24 Jan 2012 16:47:24 +0000 (16:47 +0000)
+       PR c++/51928
+       * class.c (set_method_tm_attributes): Use TARGET_THUNK instead of
+       thunk for set_one_vmethod_tm_attributes.

Co-Authored-By: Patrick Marlier <patrick.marlier@gmail.com>
From-SVN: r183478

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

index 9eb975d..6dbb433 100644 (file)
@@ -1,3 +1,10 @@
+2012-01-24  Aldy Hernandez  <aldyh@redhat.com>
+           Patrick Marlier  <patrick.marlier@gmail.com>
+
+       PR c++/51928
+       * class.c (set_method_tm_attributes): Use TARGET_THUNK instead of
+       thunk for set_one_vmethod_tm_attributes.
+
 2012-01-24  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51223
index d654b76..35e0864 100644 (file)
@@ -4430,7 +4430,12 @@ set_method_tm_attributes (tree t)
       tree vchain;
       for (vchain = BINFO_VIRTUALS (TYPE_BINFO (t)); vchain;
           vchain = TREE_CHAIN (vchain))
-       set_one_vmethod_tm_attributes (t, BV_FN (vchain));
+       {
+         fndecl = BV_FN (vchain);
+         if (DECL_THUNK_P (fndecl))
+           fndecl = THUNK_TARGET (fndecl);
+         set_one_vmethod_tm_attributes (t, fndecl);
+       }
     }
 
   /* If the class doesn't have an attribute, nothing more to do.  */
diff --git a/gcc/testsuite/g++.dg/tm/pr51928.C b/gcc/testsuite/g++.dg/tm/pr51928.C
new file mode 100644 (file)
index 0000000..22dbadd
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm" } */
+
+struct A; // { dg-error "forward declaration of 'struct A'" }
+
+struct B
+{
+  virtual B* foo(A);
+};
+
+struct C : virtual B
+{
+  virtual C* foo(A) { return 0; } // { dg-error "'<anonymous>' has incomplete type" }
+};
+
+C c;