46 if (Result.Context->getDiagnostics().hasUncompilableErrorOccurred())
57 const auto *ND = Result.Nodes.getNodeAs<NamedDecl>(
"name-decl");
59 if (ND->isInvalidDecl())
69 if (!ND->hasExternalFormalLinkage() || ND->isInAnonymousNamespace())
72 if (
const auto *FD = dyn_cast<FunctionDecl>(ND)) {
77 if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
80 if (FD->isTemplateInstantiation())
84 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
85 const auto *DC = MD->getDeclContext();
86 while (DC->isRecord()) {
87 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
88 if (isa<ClassTemplatePartialSpecializationDecl>(RD))
90 if (RD->getDescribedClassTemplate())
97 const bool IsFullSpec =
98 FD->getTemplateSpecializationKind() != TSK_Undeclared;
99 diag(FD->getLocation(),
100 "%select{function|full function template specialization}0 %1 defined "
101 "in a header file; function definitions in header files can lead to "
107 diag(FD->getLocation(),
"mark the definition as 'inline'",
109 << FixItHint::CreateInsertion(FD->getInnerLocStart(),
"inline ");
110 }
else if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
112 if (VD->getDescribedVarTemplate())
115 if (VD->getDeclContext()->isDependentContext() && VD->isStaticDataMember())
118 if (isTemplateInstantiation(VD->getTemplateSpecializationKind()))
121 if (VD->hasLocalStorage() || VD->isStaticLocal())
127 if (isa<VarTemplatePartialSpecializationDecl>(VD))
130 diag(VD->getLocation(),
131 "variable %0 defined in a header file; "
132 "variable definitions in header files can lead to ODR violations")
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.