From patchwork Fri Oct 28 14:50:50 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [trans-mem] fix C++ transaction_wrap attribute Date: Fri, 28 Oct 2011 04:50:50 -0000 From: Aldy Hernandez X-Patchwork-Id: 122414 Message-Id: <4EAAC14A.80908@redhat.com> To: Richard Henderson , Torvald Riegel , gcc-patches 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" } */