diff options
Diffstat (limited to 'docs')
-rw-r--r-- | docs/LibASTMatchersReference.html | 111 |
1 files changed, 79 insertions, 32 deletions
diff --git a/docs/LibASTMatchersReference.html b/docs/LibASTMatchersReference.html index 2af0a7c9e3..6506282f08 100644 --- a/docs/LibASTMatchersReference.html +++ b/docs/LibASTMatchersReference.html @@ -4810,16 +4810,20 @@ with withInitializer matching (1) <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is -matched by a given matcher. +<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a +given matcher. Implicit object expressions are included; that is, it matches +use of implicit `this`. Given - struct X { int m; }; - void f(X x) { x.m; m; } -memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) - matches "x.m" and "m" -with hasObjectExpression(...) - matching "x" and the implicit object expression of "m" which has type X*. + struct X { + int m; + int f(X x) { x.m; return m; } + }; +memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`. </pre></td></tr> @@ -4857,16 +4861,39 @@ matches 'a' in <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> +<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike +`on`, matches the argument directly without stripping away anything. + +Given + class Y { public: void m(); }; + Y g(); + class X : public Y { void g(); }; + void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } +cxxMemberCallExpr(onImplicitObjectArgument(hasType( + cxxRecordDecl(hasName("Y"))))) + matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. +cxxMemberCallExpr(on(callExpr())) + does not match `(g()).m()`, because the parens are not ignored. + +FIXME: Overload to allow directly matching types? +</pre></td></tr> <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. +<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after +stripping off any parentheses or implicit casts. -Example matches y.x() - (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) - class Y { public: void x(); }; - void z() { Y y; y.x(); } +Given + class Y { public: void m(); }; + Y g(); + class X : public Y {}; + void z(Y y, X x) { y.m(); (g()).m(); x.m(); } +cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) + matches `y.m()` and `(g()).m()`. +cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) + matches `x.m()`. +cxxMemberCallExpr(on(callExpr())) + matches `(g()).m()`. FIXME: Overload to allow directly matching types? </pre></td></tr> @@ -4878,8 +4905,20 @@ FIXME: Overload to allow directly matching types? <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified -matcher, or is a pointer to a type that matches the InnerMatcher. +<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either +matches the InnerMatcher, or is a pointer to a type that matches the +InnerMatcher. + +Given + class Y { public: void m(); }; + class X : public Y { void g(); }; + void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } +cxxMemberCallExpr(thisPointerType(hasDeclaration( + cxxRecordDecl(hasName("Y"))))) + matches `y.m()`, `p->m()` and `x.m()`. +cxxMemberCallExpr(thisPointerType(hasDeclaration( + cxxRecordDecl(hasName("X"))))) + matches `x.g()`. </pre></td></tr> @@ -5984,16 +6023,20 @@ Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Addr <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is -matched by a given matcher. +<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a +given matcher. Implicit object expressions are included; that is, it matches +use of implicit `this`. Given - struct X { int m; }; - void f(X x) { x.m; m; } -memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) - matches "x.m" and "m" -with hasObjectExpression(...) - matching "x" and the implicit object expression of "m" which has type X*. + struct X { + int m; + int f(X x) { x.m; return m; } + }; +memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`. </pre></td></tr> @@ -6805,16 +6848,20 @@ Example matches true (matcher = hasUnaryOperand( <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is -matched by a given matcher. +<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a +given matcher. Implicit object expressions are included; that is, it matches +use of implicit `this`. Given - struct X { int m; }; - void f(X x) { x.m; m; } -memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) - matches "x.m" and "m" -with hasObjectExpression(...) - matching "x" and the implicit object expression of "m" which has type X*. + struct X { + int m; + int f(X x) { x.m; return m; } + }; +memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`. </pre></td></tr> |