From: Dodji Seketeli Date: Fri, 28 Sep 2012 13:32:41 +0000 (+0000) Subject: PR c++/54372 - unused attribute inactive on dependant entities X-Git-Tag: misc/gccgo-go1_1_2~586 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d10402b413dfbc968d7edf21415c659db1646345;p=thirdparty%2Fgcc.git PR c++/54372 - unused attribute inactive on dependant entities In the example of this patch, gcc/g++ invoked with -Wunused-local-typedefs warns on dependant entities even when those are decorated with the 'unused' attribute. This is because in cplus_decl_attributes, save_template_attributes makes so that the 'unused' attribute is applied to its appertaining entity only at instantiation time. But then at parsing time maybe_warn_unused_local_typedefs checks for TREE_USED before warning. This patch applies the 'unused' attribute at compilation time. Tested on x86_64-unknown-linux-gnu against trunk. gcc/cp/ * decl2.c (is_late_template_attribute): "unused" attribute is to be applied at compile time. gcc/testsuite/ * c-c++-common/Wunused-local-typedefs-2.c: New test. From-SVN: r191830 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3ba5de4eb7a5..6550e16c654d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-09-28 Dodji Seketeli + + PR c++/54372 - unused attribute inactive on dependant entities + * decl2.c (is_late_template_attribute): "unused" attribute is to + be applied at compile time. + 2012-09-25 Dodji Seketeli PR c++/29028 - Missed unused warning on using declaration diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 0df461340bc5..a590d1781561 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1104,6 +1104,11 @@ is_late_template_attribute (tree attr, tree decl) if (is_attribute_p ("weak", name)) return true; + /* Attribute unused is applied directly, as it appertains to + decls. */ + if (is_attribute_p ("unused", name)) + return false; + /* If any of the arguments are dependent expressions, we can't evaluate the attribute until instantiation time. */ for (arg = args; arg; arg = TREE_CHAIN (arg)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 407184d17bed..22ff3f58ef0f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-28 Dodji Seketeli + + PR c++/54372 - unused attribute inactive on dependant entities + * c-c++-common/Wunused-local-typedefs-2.c: New test. + 2012-09-25 Dodji Seketeli PR c++/29028 - Missed unused warning on using declaration diff --git a/gcc/testsuite/c-c++-common/Wunused-local-typedefs-2.c b/gcc/testsuite/c-c++-common/Wunused-local-typedefs-2.c new file mode 100644 index 000000000000..77bacd788baf --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wunused-local-typedefs-2.c @@ -0,0 +1,35 @@ +/* Origin PR c++/54372 + { dg-options "-Wunused-local-typedefs" } + { dg-do compile } +*/ + +template +void f2() +{ + typedef T t __attribute__((unused)); +} + +class S +{ + template + void f4() + { + typedef T t __attribute__((unused)); + } +}; + +template +class tS +{ + void f() + { + typedef T t2 __attribute__((unused)); + } + + template + void f2() + { + typedef T t1 __attribute__((unused)); + typedef U t2 __attribute__((unused)); + } +};