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 UserDefinedType = qualType(
47 hasUnqualifiedDesugaredType(tagType(unless(hasDeclaration(tagDecl(
48 hasAncestor(namespaceDecl(hasAnyName(
"std",
"posix"),
49 unless(hasParent(namespaceDecl()))))))))));
50 auto HasNoProgramDefinedTemplateArgument = unless(
51 hasAnyTemplateArgumentIncludingPack(refersToType(UserDefinedType)));
52 auto InsideStdClassOrClassTemplateSpecialization = hasDeclContext(
53 anyOf(cxxRecordDecl(HasStdParent),
54 classTemplateSpecializationDecl(
55 HasStdParent, HasNoProgramDefinedTemplateArgument)));
76 auto BadNonTemplateSpecializationDecl =
77 decl(unless(anyOf(functionDecl(isExplicitTemplateSpecialization()),
78 varDecl(isExplicitTemplateSpecialization()),
79 cxxRecordDecl(isExplicitTemplateSpecialization()))),
81 auto BadClassTemplateSpec = classTemplateSpecializationDecl(
82 HasNoProgramDefinedTemplateArgument, HasStdParent);
83 auto BadInnerClassTemplateSpec = classTemplateSpecializationDecl(
84 InsideStdClassOrClassTemplateSpecialization);
85 auto BadFunctionTemplateSpec =
86 functionDecl(unless(cxxMethodDecl()), isExplicitTemplateSpecialization(),
87 HasNoProgramDefinedTemplateArgument, HasStdParent);
88 auto BadMemberFunctionSpec =
89 cxxMethodDecl(isExplicitTemplateSpecialization(),
90 InsideStdClassOrClassTemplateSpecialization);
92 Finder->addMatcher(decl(anyOf(BadNonTemplateSpecializationDecl,
93 BadClassTemplateSpec, BadInnerClassTemplateSpec,
94 BadFunctionTemplateSpec, BadMemberFunctionSpec),
95 unless(isExpansionInSystemHeader()))
112 const MatchFinder::MatchResult &Result) {
113 const auto *D = Result.Nodes.getNodeAs<Decl>(
"decl");
114 const auto *NS = Result.Nodes.getNodeAs<NamespaceDecl>(
"nmspc");
118 diag(D->getLocation(),
119 "modification of %0 namespace can result in undefined behavior")
124 assert(NS->getCanonicalDecl() == LexNS->getCanonicalDecl() &&
125 "Mismatch in found namespace");
126 diag(LexNS->getLocation(),
"%0 namespace opened here", DiagnosticIDs::Note)