Skip to content

Commit 9922502

Browse files
author
wangmi
committed
Fix redundant macro expansion checks in ASTMatchers
1 parent e9c561e commit 9922502

File tree

1 file changed

+61
-23
lines changed

1 file changed

+61
-23
lines changed

clang/lib/ASTMatchers/ASTMatchersInternal.cpp

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
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+
721758
std::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;
744781
const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
745782
typeAliasTemplateDecl;
746783
const internal::VariadicAllOfMatcher<Decl> decl;
747-
const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl> decompositionDecl;
784+
const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
785+
decompositionDecl;
748786
const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl> bindingDecl;
749787
const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
750788
linkageSpecDecl;
@@ -845,8 +883,7 @@ const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
845883
objcCategoryImplDecl;
846884
const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
847885
objcMethodDecl;
848-
const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
849-
blockDecl;
886+
const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl> blockDecl;
850887
const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
851888
const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
852889
objcPropertyDecl;
@@ -907,7 +944,8 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXRewrittenBinaryOperator>
907944
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr;
908945
const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
909946
const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
910-
const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr;
947+
const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
948+
objcIvarRefExpr;
911949
const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr;
912950
const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
913951
const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
@@ -937,13 +975,15 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
937975
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
938976
cxxBoolLiteral;
939977
const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
940-
const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral> objcStringLiteral;
978+
const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
979+
objcStringLiteral;
941980
const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
942981
characterLiteral;
943982
const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
944983
integerLiteral;
945984
const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
946-
const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral> imaginaryLiteral;
985+
const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
986+
imaginaryLiteral;
947987
const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
948988
fixedPointLiteral;
949989
const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
@@ -955,12 +995,10 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
955995
const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr> chooseExpr;
956996
const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
957997
convertVectorExpr;
958-
const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
959-
coawaitExpr;
998+
const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr> coawaitExpr;
960999
const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
9611000
dependentCoawaitExpr;
962-
const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
963-
coyieldExpr;
1001+
const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr> coyieldExpr;
9641002
const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
9651003
const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
9661004
genericSelectionExpr;

0 commit comments

Comments
 (0)