From 8651081bbe4b8e798a06b4e5b429098b58a1435d Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Fri, 23 May 2014 17:49:03 +0000 Subject: [PATCH] Add the hasRangeInit() matcher for range-based for loop. llvm-svn: 209533 --- clang/include/clang/ASTMatchers/ASTMatchers.h | 14 ++++++++++++++ clang/unittests/ASTMatchers/ASTMatchersTest.cpp | 3 +++ 2 files changed, 17 insertions(+) diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index e7d5e5f1a14f..2bee8e61b857 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -937,6 +937,20 @@ AST_MATCHER_P(CXXForRangeStmt, hasLoopVariable, internal::Matcher, return (Var != nullptr && InnerMatcher.matches(*Var, Finder, Builder)); } +/// \brief Matches the range initialization statement of a for loop. +/// +/// Example: +/// forStmt(hasRangeInit(anything())) +/// matches 'a' in +/// \code +/// for (int x : a) { } +/// \endcode +AST_MATCHER_P(CXXForRangeStmt, hasRangeInit, internal::Matcher, + InnerMatcher) { + const Expr *const Init = Node.getRangeInit(); + return (Init != nullptr && InnerMatcher.matches(*Init, Finder, Builder)); +} + /// \brief Matches while statements. /// /// Given diff --git a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp index e7d99242fcf0..4b3646791523 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp @@ -2391,6 +2391,9 @@ TEST(For, ForLoopInternals) { TEST(For, ForRangeLoopInternals) { EXPECT_TRUE(matches("void f(){ int a[] {1, 2}; for (int i : a); }", forRangeStmt(hasLoopVariable(anything())))); + EXPECT_TRUE(matches( + "void f(){ int a[] {1, 2}; for (int i : a); }", + forRangeStmt(hasRangeInit(declRefExpr(to(varDecl(hasName("a")))))))); } TEST(For, NegativeForLoopInternals) {