ScopedIncrement ScopedDepth(&CurrentDepth);
return traverse(TAL);
}
+ bool TraverseCXXForRangeStmt(CXXForRangeStmt *Node) {
+ if (!Finder->isTraversalIgnoringImplicitNodes())
+ return VisitorBase::TraverseCXXForRangeStmt(Node);
+ if (!Node)
+ return true;
+ ScopedIncrement ScopedDepth(&CurrentDepth);
+ if (auto *Init = Node->getInit())
+ if (!match(*Init))
+ return false;
+ if (!match(*Node->getLoopVariable()) || !match(*Node->getRangeInit()) ||
+ !match(*Node->getBody()))
+ return false;
+ return VisitorBase::TraverseStmt(Node->getBody());
+ }
bool TraverseLambdaExpr(LambdaExpr *Node) {
if (!Finder->isTraversalIgnoringImplicitNodes())
return VisitorBase::TraverseLambdaExpr(Node);
if (isTraversalIgnoringImplicitNodes()) {
IgnoreImplicitChildren = true;
- if (Node.get<CXXForRangeStmt>())
- ScopedTraversal = true;
}
ASTNodeNotSpelledInSourceScope RAII(this, ScopedTraversal);
int arr[2];
for (auto i : arr)
{
-
+ if (true)
+ {
+ }
}
}
)cpp";
EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, M)));
}
+ {
+ auto M = cxxForRangeStmt(hasDescendant(ifStmt()));
+ EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
+ EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, M)));
+ }
+ {
+ EXPECT_TRUE(matches(
+ Code, traverse(TK_AsIs, cxxForRangeStmt(has(declStmt(
+ hasSingleDecl(varDecl(hasName("i")))))))));
+ EXPECT_TRUE(
+ matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
+ cxxForRangeStmt(has(varDecl(hasName("i")))))));
+ }
+ {
+ EXPECT_TRUE(matches(
+ Code, traverse(TK_AsIs, cxxForRangeStmt(has(declStmt(hasSingleDecl(
+ varDecl(hasInitializer(declRefExpr(
+ to(varDecl(hasName("arr")))))))))))));
+ EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
+ cxxForRangeStmt(has(declRefExpr(
+ to(varDecl(hasName("arr")))))))));
+ }
+ {
+ auto M = cxxForRangeStmt(has(compoundStmt()));
+ EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
+ EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, M)));
+ }
{
auto M = binaryOperator(hasOperatorName("!="));
EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
true, {"-std=c++20"}));
}
{
- auto M = cxxForRangeStmt(has(declStmt()));
+ auto M =
+ cxxForRangeStmt(has(declStmt(hasSingleDecl(varDecl(hasName("i"))))));
EXPECT_TRUE(
matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++20"}));
EXPECT_FALSE(
matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
true, {"-std=c++20"}));
}
+ {
+ auto M = cxxForRangeStmt(
+ has(declStmt(hasSingleDecl(varDecl(
+ hasName("a"),
+ hasInitializer(declRefExpr(to(varDecl(hasName("arr"))))))))),
+ hasLoopVariable(varDecl(hasName("i"))),
+ hasRangeInit(declRefExpr(to(varDecl(hasName("a"))))));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++20"}));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
+ true, {"-std=c++20"}));
+ }
Code = R"cpp(
void hasDefaultArg(int i, int j = 0)
{