On Thu, Mar 08, 2018 at 10:08:20AM -0500, Jason Merrill wrote: > On Wed, Mar 7, 2018 at 5:19 PM, Jakub Jelinek <ja...@redhat.com> wrote: > > This testcase regressed when the mark_used call in finish_id_expression > > has been guarded with if (done). Wonder if we can't just mark it TREE_USED > > otherwise for the benefit of -Wunused-function and leave it > > non-DECL_ODR_USED as it should. Or do we want to mark it TREE_USED > > elsewhere? > > Probably in the processing_template_decl block near the top of > build_over_call.
This works too. Ok for trunk then (passed bootstrap/regtest on x86_64-linux and i686-linux)? 2018-03-08 Jason Merrill <ja...@redhat.com> Jakub Jelinek <ja...@redhat.com> PR c++/80598 * call.c (build_over_call): In templates set TREE_USED (first_fn) when not calling mark_used for the benefit of -Wunused-function warning. * g++.dg/warn/Wunused-function4.C: New test. --- gcc/cp/call.c.jj 2018-03-08 10:58:58.157373982 +0100 +++ gcc/cp/call.c 2018-03-08 16:18:19.897340581 +0100 @@ -7634,6 +7634,10 @@ build_over_call (struct z_candidate *can if (undeduced_auto_decl (fn)) mark_used (fn, complain); + else + /* Otherwise set TREE_USED for the benefit of -Wunused-function. + See PR80598. */ + TREE_USED (fn) = 1; return_type = TREE_TYPE (TREE_TYPE (fn)); nargs = vec_safe_length (args); --- gcc/testsuite/g++.dg/warn/Wunused-function4.C.jj 2018-03-08 16:16:23.756274559 +0100 +++ gcc/testsuite/g++.dg/warn/Wunused-function4.C 2018-03-08 16:16:23.756274559 +0100 @@ -0,0 +1,21 @@ +// PR c++/80598 +// { dg-do compile } +// { dg-options "-Wunused-function" } + +static void +foo () // { dg-bogus "defined but not used" } +{ +} + +static void +bar () // { dg-warning "defined but not used" } +{ +} + +template <class T> +int +baz (T x) +{ + foo (); + return 0; +} Jakub