re PR c++/80598 (-Wunused triggers for functions used in uninstantiated templates)
authorJason Merrill <jason@redhat.com>
Thu, 8 Mar 2018 21:18:50 +0000 (22:18 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 8 Mar 2018 21:18:50 +0000 (22:18 +0100)
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.

From-SVN: r258370

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wunused-function4.C [new file with mode: 0644]

index 9dd7c17..3c1e4c7 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-08  Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@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.
+
 2018-03-06  Jason Merrill  <jason@redhat.com>
 
        * lambda.c (is_capture_proxy_with_ref): Remove.
index f83d51f..fd6528f 100644 (file)
@@ -7634,6 +7634,10 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
 
       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);
index 32740bf..1917aef 100644 (file)
@@ -1,5 +1,8 @@
 2018-03-08  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/80598
+       * g++.dg/warn/Wunused-function4.C: New test.
+
        PR inline-asm/84742
        * gcc.target/i386/pr84742-1.c: New test.
        * gcc.target/i386/pr84742-2.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-function4.C b/gcc/testsuite/g++.dg/warn/Wunused-function4.C
new file mode 100644 (file)
index 0000000..00d5d70
--- /dev/null
@@ -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;
+}