From fc84ebfff3a3dd373129f465f2ad5763ed4423c6 Mon Sep 17 00:00:00 2001 From: Evgeny Shulgin Date: Mon, 14 Feb 2022 11:28:22 +0100 Subject: [PATCH] [clang-tidy] Ignore variable template partial specializations in `misc-definitions-in-headers` Variable template partial specializations are inline and can't lead to ODR-violations. The checker now ignores them. Fixes https://github.com/llvm/llvm-project/issues/53519 Reviewed By: hokein Differential Revision: https://reviews.llvm.org/D119098 --- .../clang-tidy/misc/DefinitionsInHeadersCheck.cpp | 3 +++ .../checkers/misc-definitions-in-headers.hpp | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp index 411d6db58243..9a7a7e108b12 100644 --- a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -149,6 +149,9 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) { // Ignore inline variables. if (VD->isInline()) return; + // Ignore partial specializations. + if (isa(VD)) + return; diag(VD->getLocation(), "variable %0 defined in a header file; " diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers.hpp b/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers.hpp index c2a4a81ae3e1..f57cc2c256fe 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers.hpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers.hpp @@ -193,6 +193,16 @@ const int f12() { return 0; } // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: full function template specialization 'f12' defined in a header file; // CHECK-FIXES: inline const int f12() { return 0; } +template +constexpr bool f13 = false; + +template +constexpr bool f13 = true; // OK: template partial specialization + +template <> +constexpr bool f13 = false; +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: variable 'f13' defined in a header file; + int main() {} // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'main' defined in a header file; // CHECK-FIXES: {{^}}int main() {