shuaiwang updated this revision to Diff 160263. shuaiwang marked 2 inline comments as done. shuaiwang added a comment.
undo unrelated changes in doc Repository: rC Clang https://reviews.llvm.org/D50606 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h lib/ASTMatchers/ASTMatchersInternal.cpp lib/ASTMatchers/Dynamic/Registry.cpp unittests/AST/ASTImporterTest.cpp unittests/ASTMatchers/ASTMatchersNodeTest.cpp
Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -422,10 +422,17 @@ TEST(MemberExpression, DoesNotMatchClasses) { EXPECT_TRUE(notMatches("class Y { void x() {} };", memberExpr())); + EXPECT_TRUE(notMatches("class Y { void x() {} };", unresolvedMemberExpr())); + EXPECT_TRUE( + notMatches("class Y { void x() {} };", cxxDependentScopeMemberExpr())); } TEST(MemberExpression, MatchesMemberFunctionCall) { EXPECT_TRUE(matches("class Y { void x() { x(); } };", memberExpr())); + EXPECT_TRUE(matches("class Y { template <class T> void x() { x<T>(); } };", + unresolvedMemberExpr())); + EXPECT_TRUE(matches("template <class T> void x() { T t; t.f(); }", + cxxDependentScopeMemberExpr())); } TEST(MemberExpression, MatchesVariable) { @@ -435,6 +442,13 @@ matches("class Y { void x() { y; } int y; };", memberExpr())); EXPECT_TRUE( matches("class Y { void x() { Y y; y.y; } int y; };", memberExpr())); + EXPECT_TRUE(matches("template <class T>" + "class X : T { void f() { this->T::v; } };", + cxxDependentScopeMemberExpr())); + EXPECT_TRUE(matches("template <class T> class X : T { void f() { T::v; } };", + cxxDependentScopeMemberExpr())); + EXPECT_TRUE(matches("template <class T> void x() { T t; t.v; }", + cxxDependentScopeMemberExpr())); } TEST(MemberExpression, MatchesStaticVariable) { Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -814,9 +814,6 @@ functionTemplateDecl()); } -const internal::VariadicDynCastAllOfMatcher<Expr, CXXDependentScopeMemberExpr> - cxxDependentScopeMemberExpr; - TEST_P(ImportExpr, ImportCXXDependentScopeMemberExpr) { MatchVerifier<Decl> Verifier; testImport( @@ -2364,9 +2361,6 @@ cxxRecordDecl(has(typedefDecl(has(dependentNameType()))))))); } -const internal::VariadicDynCastAllOfMatcher<Expr, UnresolvedMemberExpr> - unresolvedMemberExpr; - TEST_P(ImportExpr, UnresolvedMemberExpr) { MatchVerifier<Decl> Verifier; testImport("struct S { template <typename T> void mem(); };" Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -167,6 +167,7 @@ REGISTER_MATCHER(cxxCtorInitializer); REGISTER_MATCHER(cxxDefaultArgExpr); REGISTER_MATCHER(cxxDeleteExpr); + REGISTER_MATCHER(cxxDependentScopeMemberExpr); REGISTER_MATCHER(cxxDestructorDecl); REGISTER_MATCHER(cxxDynamicCastExpr); REGISTER_MATCHER(cxxForRangeStmt); @@ -475,6 +476,7 @@ REGISTER_MATCHER(unaryTransformType); REGISTER_MATCHER(unless); REGISTER_MATCHER(unresolvedLookupExpr); + REGISTER_MATCHER(unresolvedMemberExpr); REGISTER_MATCHER(unresolvedUsingTypenameDecl); REGISTER_MATCHER(unresolvedUsingValueDecl); REGISTER_MATCHER(userDefinedLiteral); Index: lib/ASTMatchers/ASTMatchersInternal.cpp =================================================================== --- lib/ASTMatchers/ASTMatchersInternal.cpp +++ lib/ASTMatchers/ASTMatchersInternal.cpp @@ -610,6 +610,10 @@ const internal::VariadicAllOfMatcher<Stmt> stmt; const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt; const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr; +const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr> + unresolvedMemberExpr; +const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDependentScopeMemberExpr> + cxxDependentScopeMemberExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr> Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -1141,6 +1141,34 @@ /// matches this->x, x, y.x, a, this->b extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr; +/// Matches unresolved member expressions. +/// +/// Given +/// \code +/// struct X { +/// template <class T> void f(); +/// void g(); +/// }; +/// template <class T> void h() { X x; x.f<T>(); x.g(); } +/// \endcode +/// unresolvedMemberExpr() +/// matches x.f<T> +extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr> + unresolvedMemberExpr; + +/// Matches member expressions where the actual member referenced could not be +/// resolved because the base expression or the member name was dependent. +/// +/// Given +/// \code +/// template <class T> void f() { T t; t.g(); } +/// \endcode +/// cxxDependentScopeMemberExpr() +/// matches t.g +extern const internal::VariadicDynCastAllOfMatcher<Stmt, + CXXDependentScopeMemberExpr> + cxxDependentScopeMemberExpr; + /// Matches call expressions. /// /// Example matches x.y() and y() Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -866,6 +866,17 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be +resolved because the base expression or the member name was dependent. + +Given + template <class T> void f() { T t; t.g(); } +cxxDependentScopeMemberExpr() + matches t.g +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. @@ -1455,6 +1466,20 @@ matches foo<T>() </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. + +Given + struct X { + template <class T> void f(); + void g(); + }; + template <class T> void h() { X x; x.f<T>(); x.g(); } +unresolvedMemberExpr() + matches x.f<T> +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. @@ -1598,7 +1623,7 @@ short i = 1; int j = 42; decltype(i + j) result = i + j; -decltypeType() +decltypeType() matches "decltype(i + j)" </pre></td></tr>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits