[cfe-dev] AST Matcher for Decl subclass CilkSpawnDecl

Georg Altmann georg.altmann at informatik.stud.uni-erlangen.de
Thu Nov 20 04:40:24 PST 2014


On 20.11.2014 10:25, Manuel Klimek wrote:
> On Wed Nov 19 2014 at 3:38:44 PM Georg Altmann
> <georg.altmann at informatik.stud.uni-erlangen.de
> <mailto:georg.altmann at informatik.stud.uni-erlangen.de>> wrote:
> 
>     Thank you for the quick reply.
> 
>     I found a partial solution to my problem. I dug down into the AST
>     matching code and noticed RecursiveASTVisitor did not recurse into
>     CapturedStmt in CilkSpawnDecl. So I did the patch
> 
> 
>     diff --git a/include/clang/AST/__RecursiveASTVisitor.h
>     b/include/clang/AST/__RecursiveASTVisitor.h
>     index 35eec69..a16e772 100755
>     --- a/include/clang/AST/__RecursiveASTVisitor.h
>     +++ b/include/clang/AST/__RecursiveASTVisitor.h
>     @@ -1305,6 +1305,7 @@ DEF_TRAVERSE_DECL(__CapturedDecl, {
>        })
> 
>      DEF_TRAVERSE_DECL(__CilkSpawnDecl, {
>     +    TRY_TO(TraverseStmt(D->__getCapturedStmt()));
>        })
> 
>      DEF_TRAVERSE_DECL(EmptyDecl, { })
> 
> 
>     Again, this is what I want to match:
>     The AST:
>     |-CompoundStmt
>     | `-CilkSpawnExpr
>     |   |-CilkSpawnDecl
>     |   | `-CapturedStmt
>     |   |   |-CapturedDecl
>     |   |   | `-ImplicitParamDecl
>     |   |   |-ExprWithCleanups
>     |   |   | `-CallExpr
>     --------------^ this guy
> 
> 
>     After the patch, these match now:
> 
>     // 1) matches
>     compoundStmt(
>       has(cilkSpawnExpr(
>        has(cilkSpawnDecl(
>          has(capturedStmt()))))))
> 
>     // 2) matches and binds
>     compoundStmt(
>       has(cilkSpawnExpr(
>         has(cilkSpawnDecl(
>           has(capturedStmt(
>             hasDescendant(__exprWithCleanups(
>               has(callExpr().bind("callExpr"__))))))))))
> 
> 
>     However this doesn't match, while it should IMHO.
> 
>     // 3) does not match
>     compoundStmt(
>       has(cilkSpawnExpr(
>         has(cilkSpawnDecl(
>             has(capturedStmt(
>                 has(exprWithCleanups())))))))
> 
> 
> Which one in this chain is the one that doesn't match? (remove inner
> ones until it matches, send result).


These match:

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt()))))))

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        has(decl()))))))))

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        // for some reason has() does not work here
        hasDescendant(exprWithCleanups(
          has(callExpr().bind("callExpr")))))))))))


None of these match:

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        has(exprWithCleanups()))))))))

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        has(expr()))))))))

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        has(stmt()))))))))

compoundStmt(
  has(cilkSpawnExpr(
    has(cilkSpawnDecl(
      has(capturedStmt(
        has(decl()))))))))

To me this looks like either
a) the ast-dump is incorrect and ExprWithCleanups is not a direct child
of CapturedStmt
or
b) there is a bug with CapturedStmt in the ast matching code /
RecursiveASTVisitor which makes ExprWithCleanups being found as
descendant but not as direct child.

Maybe a test-case against vanilla clang would be helpful? However I
don't know how to reproduce the AST without the cilk extensions.

Regards,
Georg


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141120/ed111e8c/attachment.sig>


More information about the cfe-dev mailing list