Author: shuaiwang Date: Sun Aug 12 10:34:36 2018 New Revision: 339522 URL: http://llvm.org/viewvc/llvm-project?rev=339522&view=rev Log: [ASTMatchers] Add matchers unresolvedMemberExpr, cxxDependentScopeMemberExpr
Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D50606 Modified: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/lib/ASTMatchers/ASTMatchersInternal.cpp cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp cfe/trunk/unittests/AST/ASTImporterTest.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersNodeTest.cpp Modified: cfe/trunk/docs/LibASTMatchersReference.html URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html (original) +++ cfe/trunk/docs/LibASTMatchersReference.html Sun Aug 12 10:34:36 2018 @@ -866,6 +866,17 @@ cxxDeleteExpr() </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 @@ unresolvedLookupExpr() 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 @@ Given: short i = 1; int j = 42; decltype(i + j) result = i + j; -decltypeType() +decltypeType() matches "decltype(i + j)" </pre></td></tr> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Sun Aug 12 10:34:36 2018 @@ -1141,6 +1141,34 @@ extern const internal::VariadicDynCastAl /// 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() Modified: cfe/trunk/lib/ASTMatchers/ASTMatchersInternal.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/ASTMatchersInternal.cpp?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/ASTMatchersInternal.cpp (original) +++ cfe/trunk/lib/ASTMatchers/ASTMatchersInternal.cpp Sun Aug 12 10:34:36 2018 @@ -610,6 +610,10 @@ const internal::VariadicDynCastAllOfMatc 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> Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original) +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Sun Aug 12 10:34:36 2018 @@ -167,6 +167,7 @@ RegistryMaps::RegistryMaps() { 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 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(unaryTransformType); REGISTER_MATCHER(unless); REGISTER_MATCHER(unresolvedLookupExpr); + REGISTER_MATCHER(unresolvedMemberExpr); REGISTER_MATCHER(unresolvedUsingTypenameDecl); REGISTER_MATCHER(unresolvedUsingValueDecl); REGISTER_MATCHER(userDefinedLiteral); Modified: cfe/trunk/unittests/AST/ASTImporterTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTImporterTest.cpp?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/unittests/AST/ASTImporterTest.cpp (original) +++ cfe/trunk/unittests/AST/ASTImporterTest.cpp Sun Aug 12 10:34:36 2018 @@ -814,9 +814,6 @@ TEST_P(ImportDecl, ImportFunctionTemplat functionTemplateDecl()); } -const internal::VariadicDynCastAllOfMatcher<Expr, CXXDependentScopeMemberExpr> - cxxDependentScopeMemberExpr; - TEST_P(ImportExpr, ImportCXXDependentScopeMemberExpr) { MatchVerifier<Decl> Verifier; testImport( @@ -2364,9 +2361,6 @@ TEST_P(ImportExpr, DependentNameType) { 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(); };" Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersNodeTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersNodeTest.cpp?rev=339522&r1=339521&r2=339522&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersNodeTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersNodeTest.cpp Sun Aug 12 10:34:36 2018 @@ -422,10 +422,17 @@ TEST(UnaryExprOrTypeTraitExpr, MatchesSi 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 @@ TEST(MemberExpression, MatchesVariable) 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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits