Index: clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -91,9 +91,12 @@ 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(); } } Index: clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp +++ clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp @@ -133,3 +133,28 @@ 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; +}