[cfe-dev] AST Matcher for Decl subclass CilkSpawnDecl

Manuel Klimek klimek at google.com
Thu Nov 20 04:46:13 PST 2014


On Thu Nov 20 2014 at 1:43:48 PM Georg Altmann <
georg.altmann at informatik.stud.uni-erlangen.de> wrote:

> 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.
>

The problem is that the RecursiveASTVisitor and the -ast-dump logic use
completely different code paths... I still think this is probably a bug in
one of the two.
+richardsmith, who knows more about this...


>
> Regards,
> Georg
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141120/b2713568/attachment.html>


More information about the cfe-dev mailing list