http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54372
Dodji Seketeli <dodji at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #3 from Dodji Seketeli <dodji at gcc dot gnu.org> 2012-09-20 11:27:19 UTC --- The 'unused' attribute is applied to its appertaining entity only at instantiation time. As a result, TREE_USED is not set on the entity before instantiation. But then maybe_warn_unused_local_typedefs checks for TREE_USED at compile time, and wrongly emits the warning. I am testing this patch that tests for the syntactic presence of the unused attribute: diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 6de2f1c..36c4aa6 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_spec (get_identifier ("unused"))) warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wunused_local_typedefs, "typedef %qD locally defined but not used", decl);