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) {
81 if (
const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>(
"function")) {
82 if (Func->isCXXClassMember())
83 diag(Func->getLocation(),
84 "place definition of method %0 outside of an anonymous namespace")
86 else if (Func->isStatic())
87 diag(Func->getLocation(),
88 "place static function %0 outside of an anonymous namespace")
91 diag(Func->getLocation(),
92 "function %0 is declared in an anonymous namespace; "
93 "prefer using 'static' for restricting visibility")
98 if (
const auto *Var = Result.Nodes.getNodeAs<VarDecl>(
"var")) {
99 if (Var->getStorageClass() == SC_Static)
100 diag(Var->getLocation(),
101 "place static variable %0 outside of an anonymous namespace")
104 diag(Var->getLocation(),
105 "variable %0 is declared in an anonymous namespace; "
106 "prefer using 'static' for restricting visibility")
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.