v.g.vassilev created this revision. v.g.vassilev added reviewers: aaron.ballman, ldionne. Herald added a project: All. v.g.vassilev requested review of this revision.
https://reviews.llvm.org/D29877 implements a useful -Wunused-template diagnostic detects unused internal linkage templates. This helps finding potential ODR issues in headers. Many years ago we made the diagnostic optional because libcxx was not ready. I am hoping @ldionne to help with that if we have not cleaned up libcxx already. Repository: rC Clang https://reviews.llvm.org/D143524 Files: clang/include/clang/Basic/DiagnosticGroups.td clang/test/Misc/warning-wall.c clang/test/SemaCXX/warn-func-not-needed.cpp clang/test/SemaCXX/warn-variable-not-needed.cpp Index: clang/test/SemaCXX/warn-variable-not-needed.cpp =================================================================== --- clang/test/SemaCXX/warn-variable-not-needed.cpp +++ clang/test/SemaCXX/warn-variable-not-needed.cpp @@ -4,7 +4,7 @@ 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> Index: clang/test/SemaCXX/warn-func-not-needed.cpp =================================================================== --- clang/test/SemaCXX/warn-func-not-needed.cpp +++ clang/test/SemaCXX/warn-func-not-needed.cpp @@ -10,7 +10,7 @@ } 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() { Index: clang/test/Misc/warning-wall.c =================================================================== --- clang/test/Misc/warning-wall.c +++ clang/test/Misc/warning-wall.c @@ -66,6 +66,8 @@ 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 Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -929,7 +929,7 @@ 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,
Index: clang/test/SemaCXX/warn-variable-not-needed.cpp =================================================================== --- clang/test/SemaCXX/warn-variable-not-needed.cpp +++ clang/test/SemaCXX/warn-variable-not-needed.cpp @@ -4,7 +4,7 @@ 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> Index: clang/test/SemaCXX/warn-func-not-needed.cpp =================================================================== --- clang/test/SemaCXX/warn-func-not-needed.cpp +++ clang/test/SemaCXX/warn-func-not-needed.cpp @@ -10,7 +10,7 @@ } 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() { Index: clang/test/Misc/warning-wall.c =================================================================== --- clang/test/Misc/warning-wall.c +++ clang/test/Misc/warning-wall.c @@ -66,6 +66,8 @@ 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 Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -929,7 +929,7 @@ 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,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits