shuaiwang created this revision. shuaiwang added a reviewer: aaron.ballman. Herald added a subscriber: cfe-commits.
Repository: rC Clang https://reviews.llvm.org/D52157 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp unittests/ASTMatchers/ASTMatchersNodeTest.cpp unittests/ASTMatchers/Dynamic/RegistryTest.cpp
Index: unittests/ASTMatchers/Dynamic/RegistryTest.cpp =================================================================== --- unittests/ASTMatchers/Dynamic/RegistryTest.cpp +++ unittests/ASTMatchers/Dynamic/RegistryTest.cpp @@ -440,7 +440,8 @@ Error.get()).isNull()); EXPECT_EQ("Incorrect type for arg 1. " "(Expected = Matcher<CXXRecordDecl>) != " - "(Actual = Matcher<CXXRecordDecl>&Matcher<MemberExpr>)", + "(Actual = Matcher<CXXRecordDecl>&Matcher" + "<MemberExpr|UnresolvedMemberExpr|CXXDependentScopeMemberExpr>)", Error->toString()); } Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -27,7 +27,7 @@ nullptr)); // Do not accept non-toplevel matchers. - EXPECT_FALSE(Finder.addDynamicMatcher(isArrow(), nullptr)); + EXPECT_FALSE(Finder.addDynamicMatcher(isMain(), nullptr)); EXPECT_FALSE(Finder.addDynamicMatcher(hasName("x"), nullptr)); } Index: unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -765,6 +765,11 @@ memberExpr(isArrow()))); EXPECT_TRUE(notMatches("class Y { void x() { (*this).y; } int y; };", memberExpr(isArrow()))); + EXPECT_TRUE(matches("template <class T> class Y { void x() { this->m; } };", + cxxDependentScopeMemberExpr(isArrow()))); + EXPECT_TRUE( + notMatches("template <class T> class Y { void x() { (*this).m; } };", + cxxDependentScopeMemberExpr(isArrow()))); } TEST(IsArrow, MatchesStaticMemberVariablesViaArrow) { @@ -783,6 +788,14 @@ memberExpr(isArrow()))); EXPECT_TRUE(notMatches("class Y { void x() { Y y; y.x(); } };", memberExpr(isArrow()))); + EXPECT_TRUE( + matches("class Y { template <class T> void x() { this->x<T>(); } };", + unresolvedMemberExpr(isArrow()))); + EXPECT_TRUE(matches("class Y { template <class T> void x() { x<T>(); } };", + unresolvedMemberExpr(isArrow()))); + EXPECT_TRUE( + notMatches("class Y { template <class T> void x() { (*this).x<T>(); } };", + unresolvedMemberExpr(isArrow()))); } TEST(ConversionDeclaration, IsExplicit) { Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -4703,7 +4703,9 @@ /// \endcode /// memberExpr(isArrow()) /// matches this->x, x, y.x, a, this->b -AST_MATCHER(MemberExpr, isArrow) { +AST_POLYMORPHIC_MATCHER( + isArrow, AST_POLYMORPHIC_SUPPORTED_TYPES(MemberExpr, UnresolvedMemberExpr, + CXXDependentScopeMemberExpr)) { return Node.isArrow(); } Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -2235,6 +2235,23 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed +to '.'. + +Member calls on the implicit this pointer match as called with '->'. + +Given + class Y { + void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } + int a; + static int b; + }; +memberExpr(isArrow()) + matches this->x, x, y.x, a, this->b +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. @@ -3886,6 +3903,23 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed +to '.'. + +Member calls on the implicit this pointer match as called with '->'. + +Given + class Y { + void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } + int a; + static int b; + }; +memberExpr(isArrow()) + matches this->x, x, y.x, a, this->b +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits