Hello,

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 makes maybe_warn_unused_local_typedefs check for the
syntactic presence of the 'unused' attribute.

Tested on x86_64-unknown-linux-gnu against trunk.

gcc/c-family/

        * c-common.c (maybe_warn_unused_local_typedefs): Check for the
        presence of the attribute 'unused'.

gcc/testsuite/

        * g++.dg/warn/Wunused-local-typedefs-2.C: New test.
---
 gcc/c-family/c-common.c                            |    3 +-
 .../g++.dg/warn/Wunused-local-typedefs-2.C         |   35 ++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 6de2f1c..cf8b1e1 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -10899,7 +10899,8 @@ maybe_warn_unused_local_typedefs (void)
       && errorcount == unused_local_typedefs_warn_count)
     {
       FOR_EACH_VEC_ELT (tree, l->local_typedefs, i, decl)
-       if (!TREE_USED (decl))
+       if (!TREE_USED (decl)
+           && !lookup_attribute ("unused", DECL_ATTRIBUTES (decl)))
          warning_at (DECL_SOURCE_LOCATION (decl),
                      OPT_Wunused_local_typedefs,
                      "typedef %qD locally defined but not used", decl);
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C 
b/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C
new file mode 100644
index 0000000..77bacd7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C
@@ -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));
+    }
+};
-- 
                Dodji

Reply via email to