Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -3536,9 +3536,9 @@ -
Matches the condition expression of an if statement, for loop, -or conditional operator. ++ Matcher<AbstractConditionalOperator> hasCondition Matcher<Expr> InnerMatcher Matches the condition expression of an if statement, for loop, +switch statement or conditional operator. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) if (true) {} @@ -4293,7 +4293,7 @@Matcher<DoStmt> hasCondition Matcher<Expr> InnerMatcher Matches the condition expression of an if statement, for loop, -or conditional operator. +switch statement or conditional operator. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) if (true) {} @@ -4476,7 +4476,7 @@Matcher<ForStmt> hasCondition Matcher<Expr> InnerMatcher Matches the condition expression of an if statement, for loop, -or conditional operator. +switch statement or conditional operator. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) if (true) {} @@ -4554,7 +4554,7 @@Matcher<IfStmt> hasCondition Matcher<Expr> InnerMatcher + Matches the condition expression of an if statement, for loop, -or conditional operator. +switch statement or conditional operator. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) if (true) {} @@ -5052,6 +5052,15 @@+ Matcher<SwitchStmt> hasCondition Matcher<Expr> InnerMatcher + + Matches the condition expression of an if statement, for loop, +switch statement or conditional operator. + +Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) + if (true) {} +Matcher<TagType> hasDeclaration Matcher<Decl> InnerMatcher Matches a node if the declaration associated with that node matches the given matcher. @@ -5385,7 +5394,7 @@Matcher<WhileStmt> hasCondition Matcher<Expr> InnerMatcher Matches the condition expression of an if statement, for loop, -or conditional operator. +switch statement or conditional operator. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) if (true) {} Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -3299,7 +3299,7 @@ } /// \brief Matches the condition expression of an if statement, for loop, -/// or conditional operator. +/// switch statement or conditional operator. /// /// Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) /// \code @@ -3308,7 +3308,7 @@ AST_POLYMORPHIC_MATCHER_P( hasCondition, AST_POLYMORPHIC_SUPPORTED_TYPES(IfStmt, ForStmt, WhileStmt, DoStmt, - AbstractConditionalOperator), + SwitchStmt, AbstractConditionalOperator), internal::Matcher, InnerMatcher) { const Expr *const Condition = Node.getCond(); return (Condition != nullptr && Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -958,6 +958,28 @@ callee(cxxMethodDecl(hasName("x")))))))); } +TEST(Matcher, HasCondition) { + StatementMatcher IfStmt = + ifStmt(hasCondition(cxxBoolLiteral(equals(true)))); + EXPECT_TRUE(matches("void x() { if (true) {} }", IfStmt)); + EXPECT_TRUE(notMatches("void x() { if (false) {} }", IfStmt)); + + StatementMatcher ForStmt = + forStmt(hasCondition(cxxBoolLiteral(equals(true)))); + EXPECT_TRUE(matches("void x() { for (;true;) {} }", ForStmt)); + EXPECT_TRUE(notMatches("void x() { for (;false;) {} }", ForStmt)); + + StatementMatcher WhileStmt = + whileStmt(hasCondition(cxxBoolLiteral(equals(true)))); + EXPECT_TRUE(matches("void x() { while (true) {} }", WhileStmt)); + EXPECT_TRUE(notMatches("void x() { while (false) {} }", WhileStmt)); + + StatementMatcher SwitchStmt = + switchStmt(hasCondition(integerLiteral(equals(42)))); + EXPECT_TRUE(matches("void x() { switch (42) {case 42:;} }", SwitchStmt)); + EXPECT_TRUE(notMatches("void x() { switch (43) {case 43:;} }", SwitchStmt)); +} + TEST(For, ForLoopInternals) { EXPECT_TRUE(matches("void f(){ int i; for (; i < 3 ; ); }", forStmt(hasCondition(anything()))));