Hi! Marek has recently added code to set TREE_USED bits on the elements of TREE_VEC referenced in SIZEOF_EXPR. But, as the testcase shows, it can be used on various parameter/argument packs, some of them have types as elements, others decls. And IMHO we want to set TREE_USED only on the decls listed in those, for types TREE_USED should be a property of the type regardless of whether the type is mentioned in sizeof... or not, otherwise we suddenly stop diagnosing any unused vars with those types.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/6.2/5.5? 2016-06-07 Jakub Jelinek <ja...@redhat.com> PR c++/71442 * pt.c (tsubst_copy): Only set TREE_USED on DECLs. * g++.dg/cpp0x/Wunused-variable-1.C: New test. --- gcc/cp/pt.c.jj 2016-06-01 14:17:12.000000000 +0200 +++ gcc/cp/pt.c 2016-06-07 14:29:16.608041125 +0200 @@ -14160,7 +14160,8 @@ tsubst_copy (tree t, tree args, tsubst_f len = TREE_VEC_LENGTH (expanded); /* Set TREE_USED for the benefit of -Wunused. */ for (int i = 0; i < len; i++) - TREE_USED (TREE_VEC_ELT (expanded, i)) = true; + if (DECL_P (TREE_VEC_ELT (expanded, i))) + TREE_USED (TREE_VEC_ELT (expanded, i)) = true; } if (expanded == error_mark_node) --- gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C.jj 2016-06-07 14:31:15.514486508 +0200 +++ gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C 2016-06-07 14:32:13.526730026 +0200 @@ -0,0 +1,25 @@ +// PR c++/71442 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-variable" } + +struct C +{ + template<typename... Ts> + int operator()(Ts &&...) + { + return sizeof...(Ts); + } +}; + +int +main () +{ + C {} (1, 1L, 1LL, 1.0); + char a; // { dg-warning "unused variable" } + short b; // { dg-warning "unused variable" } + int c; // { dg-warning "unused variable" } + long d; // { dg-warning "unused variable" } + long long e; // { dg-warning "unused variable" } + float f; // { dg-warning "unused variable" } + double g; // { dg-warning "unused variable" } +} Jakub