29 if (matchesFirstInRange(InnerMatcher, PackArgs.begin(), PackArgs.end(),
33 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
43 hasDeclContext(namespaceDecl(hasAnyName(
"std",
"posix"),
44 unless(hasParent(namespaceDecl())))
46 auto UserDefinedDecl =
47 namedDecl(anyOf(classTemplateDecl(), tagDecl()),
48 hasAncestor(namespaceDecl(hasAnyName(
"std",
"posix"),
49 unless(hasParent(namespaceDecl())))));
50 auto UserDefinedType = qualType(hasUnqualifiedDesugaredType(anyOf(
51 tagType(unless(hasDeclaration(UserDefinedDecl))),
52 templateSpecializationType(unless(hasDeclaration(UserDefinedDecl))))));
53 auto HasNoProgramDefinedTemplateArgument = unless(
54 hasAnyTemplateArgumentIncludingPack(refersToType(UserDefinedType)));
55 auto InsideStdClassOrClassTemplateSpecialization = hasDeclContext(
56 anyOf(cxxRecordDecl(HasStdParent),
57 classTemplateSpecializationDecl(
58 HasStdParent, HasNoProgramDefinedTemplateArgument)));
79 auto BadNonTemplateSpecializationDecl =
80 decl(unless(anyOf(functionDecl(isExplicitTemplateSpecialization()),
81 varDecl(isExplicitTemplateSpecialization()),
82 cxxRecordDecl(isExplicitTemplateSpecialization()))),
84 auto BadClassTemplateSpec = classTemplateSpecializationDecl(
85 HasNoProgramDefinedTemplateArgument, HasStdParent);
86 auto BadInnerClassTemplateSpec = classTemplateSpecializationDecl(
87 InsideStdClassOrClassTemplateSpecialization);
88 auto BadFunctionTemplateSpec =
89 functionDecl(unless(cxxMethodDecl()), isExplicitTemplateSpecialization(),
90 HasNoProgramDefinedTemplateArgument, HasStdParent);
91 auto BadMemberFunctionSpec =
92 cxxMethodDecl(isExplicitTemplateSpecialization(),
93 InsideStdClassOrClassTemplateSpecialization);
95 Finder->addMatcher(decl(anyOf(BadNonTemplateSpecializationDecl,
96 BadClassTemplateSpec, BadInnerClassTemplateSpec,
97 BadFunctionTemplateSpec, BadMemberFunctionSpec))
114 const MatchFinder::MatchResult &Result) {
115 const auto *D = Result.Nodes.getNodeAs<Decl>(
"decl");
116 const auto *NS = Result.Nodes.getNodeAs<NamespaceDecl>(
"nmspc");
124 diag(D->getLocation(),
125 "modification of %0 namespace can result in undefined behavior")
130 assert(NS->getCanonicalDecl() == LexNS->getCanonicalDecl() &&
131 "Mismatch in found namespace");
132 diag(LexNS->getLocation(),
"%0 namespace opened here", DiagnosticIDs::Note)