https://github.com/flash1729 created 
https://github.com/llvm/llvm-project/pull/206123

Uncomment `UnusedTemplate` in the `Unused` diagnostic group so 
`-Wunused-template` becomes part of `-Wall`.

`-Wunused-template` flags unused function and variable templates with internal 
linkage. In a header, such a template gives every translation unit its own 
internal-linkage copy, which is a latent ODR violation (ill-formed, no 
diagnostic required), so enabling this surfaces a real class of bugs and keeps 
the pattern from reappearing.

### Depends on

The in-tree occurrences were cleaned up first in a series of NFC PRs tracked by 
#202945. This change only builds clean once those land, so CI will be red on 
any area whose cleanup is not yet merged. Remaining prerequisites:

- #202969
- #202971
- #202973
- #202974
- #202988

Closes #202945

>From 07c80e2d67336f06ced11e908d8b33105def4a33 Mon Sep 17 00:00:00 2001
From: flash1729 <[email protected]>
Date: Fri, 26 Jun 2026 21:40:49 +0530
Subject: [PATCH] [Clang] Enable -Wunused-template under -Wall

Uncomment UnusedTemplate in the Unused diagnostic group so -Wunused-template
is part of -Wall. It diagnoses unused function and variable templates with
internal linkage; in a header, such a template gives every translation unit
its own internal-linkage copy, which is a latent ODR violation.

Also update the affected tests (Misc/warning-wall.c and the
warn-func-not-needed.cpp / warn-variable-not-needed.cpp -verify tests) and add
a release note.

Closes #202945.
---
 clang/docs/ReleaseNotes.rst                     | 4 ++++
 clang/include/clang/Basic/DiagnosticGroups.td   | 2 +-
 clang/test/Misc/warning-wall.c                  | 2 ++
 clang/test/SemaCXX/warn-func-not-needed.cpp     | 2 +-
 clang/test/SemaCXX/warn-variable-not-needed.cpp | 2 +-
 5 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index d1303d4c98507..a4c1381836d75 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -676,6 +676,10 @@ Improvements to Clang's diagnostics
 - Diagnostics for the C++11 range-based for statement now report the correct
   iterator type in notes for invalid iterator types.
 
+- ``-Wunused-template`` is now part of ``-Wall``. It diagnoses unused function
+  and variable templates with internal linkage, which in a header is a latent
+  ODR hazard. It can be disabled with ``-Wno-unused-template``. (#GH202945)
+
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index 6418ab4757a0c..17f4629c1c4c4 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1359,7 +1359,7 @@ def Conversion
 def Unused : DiagGroup<"unused",
                        [UnusedArgument, UnusedFunction, UnusedLabel,
                         // UnusedParameter, (matches GCC's behavior)
-                        // UnusedTemplate, (clean-up libc++ before enabling)
+                        UnusedTemplate,
                         // UnusedMemberFunction, (clean-up llvm before 
enabling)
                         UnusedPrivateField, UnusedLambdaCapture,
                         UnusedLocalTypedef, UnusedValue, UnusedVariable,
diff --git a/clang/test/Misc/warning-wall.c b/clang/test/Misc/warning-wall.c
index 6d6c4e562400f..ade9cbaace77e 100644
--- a/clang/test/Misc/warning-wall.c
+++ b/clang/test/Misc/warning-wall.c
@@ -73,6 +73,8 @@ CHECK-NEXT:      -Wunused-argument
 CHECK-NEXT:      -Wunused-function
 CHECK-NEXT:        -Wunneeded-internal-declaration
 CHECK-NEXT:      -Wunused-label
+CHECK-NEXT:      -Wunused-template
+CHECK-NEXT:        -Wunneeded-internal-declaration
 CHECK-NEXT:      -Wunused-private-field
 CHECK-NEXT:      -Wunused-lambda-capture
 CHECK-NEXT:      -Wunused-local-typedef
diff --git a/clang/test/SemaCXX/warn-func-not-needed.cpp 
b/clang/test/SemaCXX/warn-func-not-needed.cpp
index cb3cae4cd6c76..74438543c43b7 100644
--- a/clang/test/SemaCXX/warn-func-not-needed.cpp
+++ b/clang/test/SemaCXX/warn-func-not-needed.cpp
@@ -10,7 +10,7 @@ void foo() {
 }
 
 namespace test1_template {
-template <typename T> static void f() {}
+template <typename T> static void f() {} // expected-warning {{unused function 
template}}
 template <> void f<int>() {} // expected-warning {{function 'f<int>' is not 
needed and will not be emitted}}
 template <typename T>
 void foo() {
diff --git a/clang/test/SemaCXX/warn-variable-not-needed.cpp 
b/clang/test/SemaCXX/warn-variable-not-needed.cpp
index 272c8998d15c0..d234e9140e3fd 100644
--- a/clang/test/SemaCXX/warn-variable-not-needed.cpp
+++ b/clang/test/SemaCXX/warn-variable-not-needed.cpp
@@ -4,7 +4,7 @@ namespace test1 {
   static int abc = 42; // expected-warning {{variable 'abc' is not needed and 
will not be emitted}}
 
   namespace {
-  template <typename T> int abc_template = 0;
+  template <typename T> int abc_template = 0; // expected-warning {{unused 
variable template}}
   template <> int abc_template<int> = 0; // expected-warning {{variable 
'abc_template<int>' is not needed and will not be emitted}}
   }                                      // namespace
   template <typename T>

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to