From 29634fe676c855777562f8697ebfc3bb6edd5c64 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 3 Feb 2016 12:10:27 +0000 Subject: [PATCH] [clang-tidy] bug fix: Don't warn on partial template specialization in `misc-definitions-in-headers` check. Reviewers: alexfh Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D16578 llvm-svn: 259643 --- .../misc/DefinitionsInHeadersCheck.cpp | 5 +++- .../misc-definitions-in-headers.hpp | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp index 29fa0f6d5bf0..1b9cf29c041a 100644 --- a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -91,9 +91,12 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) { if (const auto *MD = dyn_cast(FD)) { const auto *DC = MD->getDeclContext(); while (DC->isRecord()) { - if (const auto *RD = dyn_cast(DC)) + if (const auto *RD = dyn_cast(DC)) { + if (isa(RD)) + return; if (RD->getDescribedClassTemplate()) return; + } DC = DC->getParent(); } } diff --git a/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp b/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp index 29d999917be2..fb35749cd39e 100644 --- a/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp +++ b/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp @@ -133,3 +133,28 @@ const char* const g = "foo"; // OK: internal linkage variable definition. static int h = 1; // OK: internal linkage variable definition. const int i = 1; // OK: internal linkage variable definition. extern int j; // OK: internal linkage variable definition. + +template +struct CD { + int f(); +}; + +template +struct CD { + int f(); +}; + +template <> +struct CD { + int f(); +}; + +int CD::f() { +// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: function 'f' defined in a header file; + return 0; +} + +template +int CD::f() { // OK: partial template specialization. + return 0; +}