[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