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 @@ -122,10 +122,12 @@ } } + bool is_full_spec = FD->getTemplateSpecializationKind() != TSK_Undeclared; diag(FD->getLocation(), - "function %0 defined in a header file; " - "function definitions in header files can lead to ODR violations") - << FD << FixItHint::CreateInsertion( + "%select{function|full function template specialization}0 %1 defined " + "in a header file; function definitions in header files can lead to " + "ODR violations") + << is_full_spec << FD << FixItHint::CreateInsertion( FD->getReturnTypeSourceRange().getBegin(), "inline "); } else if (const auto *VD = dyn_cast(ND)) { // Static data members of a class template are allowed. 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 @@ -28,7 +28,7 @@ template <> int CA::f3() { -// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: function 'f3' defined in a header file; +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: full function template specialization 'f3' defined in a header file; // CHECK-FIXES: inline int CA::f3() { int a = 1; return a; @@ -92,7 +92,7 @@ template <> int f3() { -// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f3' defined in a header file; +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: full function template specialization 'f3' defined in a header file; // CHECK-FIXES: inline int f3() { int a = 1; return a;