And while I approve of the new matcher, can't your original problem be solved with the memberExpr() matcher?<div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Oct 21, 2012 at 8:41 PM, Gábor Horváth <span dir="ltr"><<a href="mailto:xazax.hun@gmail.com" target="_blank">xazax.hun@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi djasper, klimek,<br>
<br>
Given a snippet like :<br>
struct foo {<br>
  int i;<br>
  int f() { return i; }<br>
};<br>
<br>
I know no way to determine if we match where i is used determine if i is a member of foo or not. Or if we match the fieldDecl of foo, we can not match where i is used.<br>
<br>
For other similar cases there is declRefExpr, but it is not usable in this scenario, however thisExpr can be a solution for this case.<br>
<br>
For example to match functor predicates that are not stateless I'm using something like:<br>
thisExpr(hasAncestor(methodDecl(allOf(hasName("operator()"), returns(asString("_Bool")))))).bind("id")<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D70" target="_blank">http://llvm-reviews.chandlerc.com/D70</a><br>
<br>
Files:<br>
  include/clang/ASTMatchers/ASTMatchers.h<br>
  unittests/ASTMatchers/ASTMatchersTest.cpp<br>
<br>
Index: include/clang/ASTMatchers/ASTMatchers.h<br>
===================================================================<br>
--- include/clang/ASTMatchers/ASTMatchers.h<br>
+++ include/clang/ASTMatchers/ASTMatchers.h<br>
@@ -546,6 +546,18 @@<br>
   Stmt,<br>
   CXXConstructExpr> constructExpr;<br>
<br>
+/// \brief Matches implicit and explicit this expressions.<br>
+///<br>
+/// Example matches "this" before i.<br>
+///     (matcher = thisExpr())<br>
+/// \code<br>
+/// struct foo {<br>
+///   int i;<br>
+///   int f() { return i; }<br>
+/// };<br>
+/// \endcode<br>
+const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr;<br>
+<br>
 /// \brief Matches nodes where temporaries are created.<br>
 ///<br>
 /// Example matches FunctionTakesString(GetStringByValue())<br>
Index: unittests/ASTMatchers/ASTMatchersTest.cpp<br>
===================================================================<br>
--- unittests/ASTMatchers/ASTMatchersTest.cpp<br>
+++ unittests/ASTMatchers/ASTMatchersTest.cpp<br>
@@ -1333,6 +1333,13 @@<br>
                  Constructor1Arg));<br>
 }<br>
<br>
+TEST(Matcher,ThisExpr) {<br>
+  EXPECT_TRUE(<br>
+      matches("struct X { int a; int f () { return a; } };", thisExpr()));<br>
+  EXPECT_TRUE(<br>
+      notMatches("struct X { int f () { int a; return a; } };", thisExpr()));<br>
+}<br>
+<br>
 TEST(Matcher, BindTemporaryExpression) {<br>
   StatementMatcher TempExpression = bindTemporaryExpr();<br>
</blockquote></div><br></div>