]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/54372 - unused attribute inactive on dependant entities
authorDodji Seketeli <dodji@redhat.com>
Fri, 28 Sep 2012 13:32:41 +0000 (13:32 +0000)
committerDodji Seketeli <dodji@gcc.gnu.org>
Fri, 28 Sep 2012 13:32:41 +0000 (15:32 +0200)
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

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wunused-local-typedefs-2.c [new file with mode: 0644]

index 3ba5de4eb7a5e22413b499dba06d4d6cb2c28216..6550e16c654daa7698c3e4eee37e687f83da5b44 100644 (file)
@@ -1,3 +1,9 @@
+2012-09-28  Dodji Seketeli  <dodji@redhat.com>
+
+       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  <dodji@redhat.com>
 
        PR c++/29028 - Missed unused warning on using declaration
index 0df461340bc53aed831aa719aaec7764660723c2..a590d1781561f1a5e29119ce73866576445547b1 100644 (file)
@@ -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))
index 407184d17bedb1897d884cb3c81adbedbd21abcb..22ff3f58ef0fa1c5ff2c7b691172c486d4279d41 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-28  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/54372 - unused attribute inactive on dependant entities
+       * c-c++-common/Wunused-local-typedefs-2.c: New test.
+
 2012-09-25  Dodji Seketeli  <dodji@redhat.com>
 
        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 (file)
index 0000000..77bacd7
--- /dev/null
@@ -0,0 +1,35 @@
+/*  Origin PR c++/54372
+    { dg-options "-Wunused-local-typedefs" }
+    { dg-do compile }
+*/
+
+template <typename T>
+void f2()
+{
+    typedef T t __attribute__((unused));
+}
+
+class S
+{
+    template <typename T>
+    void f4()
+    {
+       typedef T t __attribute__((unused));
+    }
+};
+
+template <typename T>
+class tS
+{
+    void f()
+    {
+       typedef T t2 __attribute__((unused));
+    }
+
+    template <typename U>
+    void f2()
+    {
+       typedef T t1 __attribute__((unused));
+       typedef U t2 __attribute__((unused));
+    }
+};