<br><br><div class="gmail_quote">On Tue Nov 18 2014 at 3:42:46 PM Georg Altmann <<a href="mailto:georg.altmann@informatik.stud.uni-erlangen.de">georg.altmann@informatik.stud.uni-erlangen.de</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I am working on a modified version of clang for Intel Cilk Plus, from<br>
<a href="https://github.com/cilkplus" target="_blank">https://github.com/cilkplus</a><br>
based on clang 3.4.<br>
<br>
They added<br>
<br>
class CilkSpawnDecl : public Decl {<br>
  // ...<br>
  public:<br>
  // ...<br>
  /// \brief Returns the associated CapturedStmt.<br>
  CapturedStmt *getCapturedStmt() { return CapturedSpawn; }<br>
  const CapturedStmt *getCapturedStmt() const { return CapturedSpawn; }<br>
  // ...<br>
};<br>
<br>
However there don't seem to be any releated AST matchers and I need to match<br>
<br>
|-CompoundStmt<br>
| `-CilkSpawnExpr<br>
|   |-CilkSpawnDecl<br>
|   | `-CapturedStmt<br>
|   |   |-CapturedDecl<br>
|   |   | `-ImplicitParamDecl<br>
|   |   |-ExprWithCleanups<br>
|   |   | `-CallExpr<br>
------------^ this guy<br>
<br>
which does not seem to be possible without a customized matcher for<br>
CilkSpawnDecl.<br>
<br>
I would like to define a AST Traversal Matcher, so I can do something<br>
like this<br>
<br>
compoundStmt(<br>
  has(cilkSpawnExpr(<br>
    has(cilkSpawnDecl(<br>
      hasCapturedStmt(<br>
      ^ has(exprWithCleanups(has(<u></u>callExpr))))))))<br>
      `-- How?<br>
<br>
<br>
I already defined cilkSpawnExpr and cilkSpawnDecl by using<br>
VariadicDynCastAllOfMatcher which is working great.<br>
Yet, I still need hasCapturedStmt and I can't get my head around the AST<br>
matcher internals. I guess, I somehow need to define a matcher that<br>
takes a CilkSpawnDecl node and returns true if getCapturedStmt() != 0, e.g.<br>
<br>
match(CilkSpawnDecl const& spawnDecl) {<br>
  if (spawnDecl.getCapturedStmt())<br>
    return true;<br>
  else<br>
    return false;<br>
}<br>
<br>
But how do I define hasCapturedStmt() so that has(exprWithCleanups(...))<br>
can act on the children of CapturedStmt?<br>
I.e. how does an AST matcher hand down the list of children to the<br>
following matcher expressions?<br>
<br>
I looked at the macro AST_MATCHER_P but I'm unsure about ParamType,<br>
ASTMatchFinder and BoundNodesTreeBuilder. Can I use that?<br></blockquote><div><br></div><div>Yes. Take a look at for example:</div><div><a href="http://reviews.llvm.org/diffusion/L/browse/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h;222237$3536">http://reviews.llvm.org/diffusion/L/browse/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h;222237$3536</a><br></div><div><div>AST_MATCHER_P(ElaboratedType, hasQualifier,</div><div>              internal::Matcher<NestedNameSpecifier>, InnerMatcher) {</div><div>  if (const NestedNameSpecifier *Qualifier = Node.getQualifier())</div><div>    return InnerMatcher.matches(*Qualifier, Finder, Builder);</div><div><br></div><div>  return false;</div><div>}</div></div><div><br></div><div>You basically want to adapt this to your use case...</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks!<br>
<br>
Georg<br>
<br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div>