<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 23, 2016 at 4:02 PM David Come via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Consider the following snippet :<br class="gmail_msg">
<br class="gmail_msg">
struct R {<br class="gmail_msg">
   void unlock() {}<br class="gmail_msg">
   void lock() {}<br class="gmail_msg">
};<br class="gmail_msg">
template <class T> struct S : R {<br class="gmail_msg">
   void A(){};<br class="gmail_msg">
   void g() {<br class="gmail_msg">
     lock();<br class="gmail_msg">
     unlock();<br class="gmail_msg">
   }<br class="gmail_msg">
   void B() { A(); }<br class="gmail_msg">
};<br class="gmail_msg">
<br class="gmail_msg">
struct T {<br class="gmail_msg">
   void lock() {}<br class="gmail_msg">
   void h() { lock(); }<br class="gmail_msg">
};<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
To my big surprise, the following matcher matches only in h<br class="gmail_msg">
<br class="gmail_msg">
cxxMemberCallExpr(callee(functionDecl(hasName("lock"))))<br class="gmail_msg">
<br class="gmail_msg">
A closer look at S AST shows the following in S<br class="gmail_msg">
<br class="gmail_msg">
|   |-CXXMethodDecl 0x2dbeb98 <line:29:1, col:26> col:6 g 'void (void)'<br class="gmail_msg">
|   | └-CompoundStmt 0x2dbee40 <col:9, col:26><br class="gmail_msg">
|   |   |-CallExpr 0x2dbeda0 <col:10, col:15> '<dependent type>'<br class="gmail_msg">
|   |   | └-MemberExpr 0x2dbed68 <col:10> '<bound member function type>'<br class="gmail_msg">
->lock 0x2dbe540<br class="gmail_msg">
|   |   |   └-CXXThisExpr 0x2dbed50 <col:10> 's<T> *' this<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
memberExpr(member(functionDecl(hasName("lock")))) matches the member<br class="gmail_msg">
expressions themselves (in h and g), but<br class="gmail_msg">
<br class="gmail_msg">
callExpr(memberExpr(member(functionDecl(hasName("lock"))))) matches<br class="gmail_msg">
nothing</blockquote><div><br></div><div>callExpr(has(memberExpr())) matches</div><div><br></div><div>callExpr(memberExpr()) would mean that the call expr *is-a* member expr, which is not true.</div><div><br></div><div>Generally, inner matchers will match on the same node.</div><div>decl(decl(decl().bind("i"))).bind("j") will bind the same node to i and j.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> nor does<br class="gmail_msg">
cxxMemberCallExpr(memberExpr(member(functionDecl(hasName("lock")))))<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Any idea how to match function calls in template classes ?</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thanks<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
David.<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
cfe-dev mailing list<br class="gmail_msg">
<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br class="gmail_msg">
</blockquote></div></div>