The C++ front-end gives us a DECL for transaction_wrap attribute's argument. The C front-end OTOH gives us an IDENTIFIER_NODE. I have no idea why this change after the merge, but I have fixed the attribute handler to work with both front-ends.

Also, for this case, distilled from testsuite/c-c++-common/tm/wrap-2.c, the C++ FE correctly complains that "f4" was not declared in this scope. The C front-end does not.

        void g4(void) __attribute__((transaction_wrap(f4)))

Suffice to say that both front-ends are sufficiently different that we should probably have two versions of testsuite/c-c++-common/tm/wrap-2.c.

The following patch fixes the attribute handler to work with both front-ends and separates wrap-2.c into C and C++ versions. With it, the wrap-* failures are fixed for C++.

Including the patches I have queued on my end, we are now down to 3 distinct C++ TM failures.

OK for branch?
        * c-family/c-common.c (handle_tm_wrap_attribute): Handle decl
        argument.
        * testsuite/c-c++-common/tm/wrap-2.c: Move...
        * testsuite/gcc.dg/tm/wrap-2.c: ...here.
        * testsuite/g++.dg/tm/wrap-2.C: New.

Index: c-family/c-common.c
===================================================================
--- c-family/c-common.c (revision 180614)
+++ c-family/c-common.c (working copy)
@@ -7489,12 +7489,15 @@ handle_tm_wrap_attribute (tree *node, tr
     warning (OPT_Wattributes, "%qE attribute ignored", name);
   else
     {
-      tree wrap_id = TREE_VALUE (args);
-      if (TREE_CODE (wrap_id) != IDENTIFIER_NODE)
+      tree wrap_decl = TREE_VALUE (args);
+      if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
+         && TREE_CODE (wrap_decl) != VAR_DECL
+         && TREE_CODE (wrap_decl) != FUNCTION_DECL)
        error ("%qE argument not an identifier", name);
       else
        {
-         tree wrap_decl = lookup_name (wrap_id);
+         if (TREE_CODE (wrap_decl) == IDENTIFIER_NODE)
+           wrap_decl = lookup_name (wrap_decl);
          if (wrap_decl && TREE_CODE (wrap_decl) == FUNCTION_DECL)
            {
              if (lang_hooks.types_compatible_p (TREE_TYPE (decl),
@@ -7504,7 +7507,7 @@ handle_tm_wrap_attribute (tree *node, tr
                error ("%qD is not compatible with %qD", wrap_decl, decl);
            }
          else
-           error ("%qE is not a function", wrap_id);
+           error ("transaction_wrap argument is not a function");
        }
     }
 
Index: testsuite/gcc.dg/tm/wrap-2.c
===================================================================
--- testsuite/gcc.dg/tm/wrap-2.c        (revision 0)
+++ testsuite/gcc.dg/tm/wrap-2.c        (revision 0)
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm" } */
+
+#define W(X)   __attribute__((transaction_wrap(X)))
+void f1(void);
+void f2(int);
+int i3;
+int f7(void);
+
+void g1(void) W(f1);
+void g2(void) W(f2);   /* { dg-error "is not compatible" } */
+void g3(void) W(i3);   /* { dg-error "is not a function" } */
+void g4(void) W(f4);   /* { dg-error "is not a function" } */
+void g5(void) W(1);    /* { dg-error "not an identifier" } */
+void g6(void) W("f1"); /* { dg-error "not an identifier" } */
+void g7(void) W(f7);   /* { dg-error "is not compatible" } */
Index: testsuite/g++.dg/tm/wrap-2.C
===================================================================
--- testsuite/g++.dg/tm/wrap-2.C        (revision 0)
+++ testsuite/g++.dg/tm/wrap-2.C        (revision 0)
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm" } */
+
+#define W(X)   __attribute__((transaction_wrap(X)))
+void f1(void);
+void f2(int);
+int i3;
+int f7(void);
+
+void g1(void) W(f1);
+void g2(void) W(f2);   /* { dg-error "is not compatible" } */
+void g3(void) W(i3);   /* { dg-error "is not a function" } */
+void g4(void) W(f4);   /* { dg-error "not declared in this scope\|not an 
identifier" } */
+void g5(void) W(1);    /* { dg-error "not an identifier" } */
+void g6(void) W("f1"); /* { dg-error "not an identifier" } */
+void g7(void) W(f7);   /* { dg-error "is not compatible" } */
Index: testsuite/c-c++-common/tm/wrap-2.c
===================================================================
--- testsuite/c-c++-common/tm/wrap-2.c  (revision 180614)
+++ testsuite/c-c++-common/tm/wrap-2.c  (working copy)
@@ -1,16 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-fgnu-tm" } */
-
-#define W(X)   __attribute__((transaction_wrap(X)))
-void f1(void);
-void f2(int);
-int i3;
-int f7(void);
-
-void g1(void) W(f1);
-void g2(void) W(f2);   /* { dg-error "is not compatible" } */
-void g3(void) W(i3);   /* { dg-error "is not a function" } */
-void g4(void) W(f4);   /* { dg-error "is not a function" } */
-void g5(void) W(1);    /* { dg-error "not an identifier" } */
-void g6(void) W("f1"); /* { dg-error "not an identifier" } */
-void g7(void) W(f7);   /* { dg-error "is not compatible" } */

Reply via email to