53 MatchFinder *Finder) {
54 const auto IsDefinitionInAnonymousNamespace = allOf(
55 unless(isExpansionInSystemHeader()), isLexicallyInAnonymousNamespace(),
56 unless(isInMacro()), isDefinition());
58 if (AllowMemberFunctionsInClass) {
60 functionDecl(IsDefinitionInAnonymousNamespace,
61 unless(anyOf(hasParent(cxxRecordDecl()),
62 hasParent(functionTemplateDecl(
63 hasParent(cxxRecordDecl()))))))
68 functionDecl(IsDefinitionInAnonymousNamespace).bind(
"function"),
this);
71 if (!AllowVariableDeclarations)
72 Finder->addMatcher(varDecl(IsDefinitionInAnonymousNamespace,
73 unless(isLocalVariable()), unless(parmVarDecl()))
79 const MatchFinder::MatchResult &Result) {
80 if (
const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>(
"function")) {
81 if (Func->isCXXClassMember())
82 diag(Func->getLocation(),
83 "place definition of method %0 outside of an anonymous namespace")
85 else if (Func->isStatic())
86 diag(Func->getLocation(),
87 "place static function %0 outside of an anonymous namespace")
90 diag(Func->getLocation(),
91 "function %0 is declared in an anonymous namespace; "
92 "prefer using 'static' for restricting visibility")
97 if (
const auto *Var = Result.Nodes.getNodeAs<VarDecl>(
"var")) {
98 if (Var->getStorageClass() == SC_Static)
99 diag(Var->getLocation(),
100 "place static variable %0 outside of an anonymous namespace")
103 diag(Var->getLocation(),
104 "variable %0 is declared in an anonymous namespace; "
105 "prefer using 'static' for restricting visibility")
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.