courbet created this revision. courbet added reviewers: aaron.ballman, alexfh. Herald added a subscriber: klimek.
This is needed to implement more checks in https://reviews.llvm.org/D38455. Repository: rC Clang https://reviews.llvm.org/D44729 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -1232,6 +1232,13 @@ cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98")); } +TEST(HasSubExpr, MatchesSimpleCase) { + EXPECT_TRUE(matches("int i = 0.0;", + implicitCastExpr(hasSubExpr(floatLiteral())))); + EXPECT_TRUE(notMatches("int i = '0';", + implicitCastExpr(hasSubExpr(floatLiteral())))); +} + TEST(HasDestinationType, MatchesSimpleCase) { EXPECT_TRUE(matches("char* p = static_cast<char*>(0);", cxxStaticCastExpr(hasDestinationType( Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -4109,6 +4109,21 @@ return InnerMatcher.matches(Node.getType(), Finder, Builder); } +/// \brief Matches casts whose subexpr matches a given matcher. +/// +/// Example matches the first cast +/// (matcher = implicitCastExpr(hasSubExpr(floatLiteral()))))) +/// int i = 0.0; +/// int j = '0'; +AST_POLYMORPHIC_MATCHER_P( + hasSubExpr, + AST_POLYMORPHIC_SUPPORTED_TYPES(CastExpr), + internal::Matcher<Expr>, InnerMatcher) { + const Expr *const SubExpr = Node.getSubExpr(); + return (SubExpr != nullptr && + InnerMatcher.matches(*SubExpr, Finder, Builder)); +} + /// \brief Matches RecordDecl object that are spelled with "struct." /// /// Example matches S, but not C or U. Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -4781,6 +4781,16 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSubExpr0')"><a name="hasSubExpr0Anchor">hasSubExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasSubExpr0"><pre>Matches casts whose subexpr matches a given matcher. + +Example matches the first cast + (matcher = implicitCastExpr(hasSubExpr(floatLiteral()))))) + int i = 0.0; + int j = '0'; +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and functionDecl that have at least one TemplateArgument matching the given
Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -1232,6 +1232,13 @@ cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98")); } +TEST(HasSubExpr, MatchesSimpleCase) { + EXPECT_TRUE(matches("int i = 0.0;", + implicitCastExpr(hasSubExpr(floatLiteral())))); + EXPECT_TRUE(notMatches("int i = '0';", + implicitCastExpr(hasSubExpr(floatLiteral())))); +} + TEST(HasDestinationType, MatchesSimpleCase) { EXPECT_TRUE(matches("char* p = static_cast<char*>(0);", cxxStaticCastExpr(hasDestinationType( Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -4109,6 +4109,21 @@ return InnerMatcher.matches(Node.getType(), Finder, Builder); } +/// \brief Matches casts whose subexpr matches a given matcher. +/// +/// Example matches the first cast +/// (matcher = implicitCastExpr(hasSubExpr(floatLiteral()))))) +/// int i = 0.0; +/// int j = '0'; +AST_POLYMORPHIC_MATCHER_P( + hasSubExpr, + AST_POLYMORPHIC_SUPPORTED_TYPES(CastExpr), + internal::Matcher<Expr>, InnerMatcher) { + const Expr *const SubExpr = Node.getSubExpr(); + return (SubExpr != nullptr && + InnerMatcher.matches(*SubExpr, Finder, Builder)); +} + /// \brief Matches RecordDecl object that are spelled with "struct." /// /// Example matches S, but not C or U. Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -4781,6 +4781,16 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSubExpr0')"><a name="hasSubExpr0Anchor">hasSubExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasSubExpr0"><pre>Matches casts whose subexpr matches a given matcher. + +Example matches the first cast + (matcher = implicitCastExpr(hasSubExpr(floatLiteral()))))) + int i = 0.0; + int j = '0'; +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and functionDecl that have at least one TemplateArgument matching the given
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits