3636#include < cstddef>
3737#include < optional>
3838#include < string>
39+ #include < unordered_set>
3940#include < utility>
4041#include < vector>
4142
@@ -136,7 +137,8 @@ class IdDynMatcher : public DynMatcherInterface {
136137 bool dynMatches (const DynTypedNode &DynNode, ASTMatchFinder *Finder,
137138 BoundNodesTreeBuilder *Builder) const override {
138139 bool Result = InnerMatcher->dynMatches (DynNode, Finder, Builder);
139- if (Result) Builder->setBinding (ID, DynNode);
140+ if (Result)
141+ Builder->setBinding (ID, DynNode);
140142 return Result;
141143 }
142144
@@ -354,7 +356,8 @@ bool DynTypedMatcher::canConvertTo(ASTNodeKind To) const {
354356 auto TypeKind = ASTNodeKind::getFromNodeKind<Type>();
355357 // / Mimic the implicit conversions of Matcher<>.
356358 // / - From Matcher<Type> to Matcher<QualType>
357- if (From.isSame (TypeKind) && To.isSame (QualKind)) return true ;
359+ if (From.isSame (TypeKind) && To.isSame (QualKind))
360+ return true ;
358361 // / - From Matcher<Base> to Matcher<Derived>
359362 return From.isBaseOf (To);
360363}
@@ -440,8 +443,8 @@ optionallyVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
440443 return true ;
441444}
442445
443- inline static
444- std::vector<std::string> vectorFromRefs (ArrayRef<const StringRef *> NameRefs) {
446+ inline static std::vector<std::string>
447+ vectorFromRefs (ArrayRef<const StringRef *> NameRefs) {
445448 std::vector<std::string> Names;
446449 Names.reserve (NameRefs.size ());
447450 for (auto *Name : NameRefs)
@@ -454,8 +457,8 @@ Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) {
454457 new internal::HasNameMatcher (vectorFromRefs (NameRefs)));
455458}
456459
457- Matcher<ObjCMessageExpr> hasAnySelectorFunc (
458- ArrayRef<const StringRef *> NameRefs) {
460+ Matcher<ObjCMessageExpr>
461+ hasAnySelectorFunc ( ArrayRef<const StringRef *> NameRefs) {
459462 return hasAnySelectorMatcher (vectorFromRefs (NameRefs));
460463}
461464
@@ -697,27 +700,61 @@ static bool isTokenAtLoc(const SourceManager &SM, const LangOptions &LangOpts,
697700 return !Invalid && Text == TokenText;
698701}
699702
700- std::optional<SourceLocation>
701- getExpansionLocOfMacro (StringRef MacroName, SourceLocation Loc,
702- const ASTContext &Context) {
703+ namespace {
704+ struct SourceLocationHash {
705+ std::size_t operator ()(const SourceLocation &Loc) const {
706+ return Loc.getHashValue ();
707+ }
708+ };
709+
710+ struct SourceLocationEqual {
711+ bool operator ()(const SourceLocation &LHS, const SourceLocation &RHS) const {
712+ return LHS == RHS;
713+ }
714+ };
715+
716+ } // namespace
717+
718+ static std::optional<SourceLocation> getExpansionLocOfMacroRecursive (
719+ StringRef MacroName, SourceLocation Loc, const ASTContext &Context,
720+ std::unordered_set<SourceLocation, SourceLocationHash, SourceLocationEqual>
721+ &CheckedLocations) {
703722 auto &SM = Context.getSourceManager ();
704723 const LangOptions &LangOpts = Context.getLangOpts ();
705724 while (Loc.isMacroID ()) {
725+ if (CheckedLocations.count (Loc)) {
726+ return std::nullopt ;
727+ }
728+ CheckedLocations.insert (Loc);
706729 SrcMgr::ExpansionInfo Expansion =
707730 SM.getSLocEntry (SM.getFileID (Loc)).getExpansion ();
708- if (Expansion.isMacroArgExpansion ())
731+ if (Expansion.isMacroArgExpansion ()) {
709732 // Check macro argument for an expansion of the given macro. For example,
710733 // `F(G(3))`, where `MacroName` is `G`.
711- if (std::optional<SourceLocation> ArgLoc = getExpansionLocOfMacro (
712- MacroName, Expansion.getSpellingLoc (), Context))
734+ if (std::optional<SourceLocation> ArgLoc =
735+ getExpansionLocOfMacroRecursive (MacroName,
736+ Expansion.getSpellingLoc (),
737+ Context, CheckedLocations)) {
713738 return ArgLoc;
739+ }
740+ }
714741 Loc = Expansion.getExpansionLocStart ();
715- if (isTokenAtLoc (SM, LangOpts, MacroName, Loc))
742+ if (isTokenAtLoc (SM, LangOpts, MacroName, Loc)) {
716743 return Loc;
744+ }
717745 }
718746 return std::nullopt ;
719747}
720748
749+ std::optional<SourceLocation>
750+ getExpansionLocOfMacro (StringRef MacroName, SourceLocation Loc,
751+ const ASTContext &Context) {
752+ std::unordered_set<SourceLocation, SourceLocationHash, SourceLocationEqual>
753+ CheckedLocations;
754+ return getExpansionLocOfMacroRecursive (MacroName, Loc, Context,
755+ CheckedLocations);
756+ }
757+
721758std::shared_ptr<llvm::Regex> createAndVerifyRegex (StringRef Regex,
722759 llvm::Regex::RegexFlags Flags,
723760 StringRef MatcherID) {
@@ -744,7 +781,8 @@ const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl> typeAliasDecl;
744781const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
745782 typeAliasTemplateDecl;
746783const internal::VariadicAllOfMatcher<Decl> decl;
747- const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl> decompositionDecl;
784+ const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
785+ decompositionDecl;
748786const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl> bindingDecl;
749787const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
750788 linkageSpecDecl;
@@ -845,8 +883,7 @@ const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
845883 objcCategoryImplDecl;
846884const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
847885 objcMethodDecl;
848- const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
849- blockDecl;
886+ const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl> blockDecl;
850887const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
851888const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
852889 objcPropertyDecl;
@@ -907,7 +944,8 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXRewrittenBinaryOperator>
907944const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr;
908945const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
909946const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
910- const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr;
947+ const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
948+ objcIvarRefExpr;
911949const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr;
912950const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
913951const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
@@ -937,13 +975,15 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
937975const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
938976 cxxBoolLiteral;
939977const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
940- const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral> objcStringLiteral;
978+ const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
979+ objcStringLiteral;
941980const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
942981 characterLiteral;
943982const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
944983 integerLiteral;
945984const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
946- const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral> imaginaryLiteral;
985+ const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
986+ imaginaryLiteral;
947987const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
948988 fixedPointLiteral;
949989const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
@@ -955,12 +995,10 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
955995const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr> chooseExpr;
956996const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
957997 convertVectorExpr;
958- const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
959- coawaitExpr;
998+ const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr> coawaitExpr;
960999const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
9611000 dependentCoawaitExpr;
962- const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
963- coyieldExpr;
1001+ const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr> coyieldExpr;
9641002const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
9651003const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
9661004 genericSelectionExpr;
0 commit comments