[cfe-commits] [PATCH] Fix pretty print when dealing with anonymous structures. PR14316.

David Blaikie dblaikie at gmail.com
Sun Nov 11 20:57:02 PST 2012


On Sun, Nov 11, 2012 at 12:25 PM, Florent Bruneau
<florent.bruneau at intersec.com> wrote:
> When I have an expression of the form:
>
>  struct blah {
>    struct {
>      struct {
>        int b;
>      };
>    };
>  };
>
>  int foo(const struct blah *b) {
>    return b->b;
>  }
>
> The expression 'b->b' has the following (correct) AST:
>
>  (ImplicitCastExpr 0x44bc968 'int' <LValueToRValue>
>    (MemberExpr 0x44bc8f0 'int' lvalue .b 0x44899b0
>      (MemberExpr 0x44bc8c0 'struct blah::<anonymous at foo.c:3:9>' lvalue .  0x4489a50
>        (MemberExpr 0x44bc890 'struct blah::<anonymous at foo.c:2:5>' lvalue -> 0x44bc2f0
>          (ImplicitCastExpr 0x44bc878 'union blah *' <LValueToRValue>
>            (DeclRefExpr 0x44bc850 'union blah *' lvalue ParmVar 0x44bc440 'b' 'union blah *'))))))
>
> But the pretty printer (and as a consequence clang -cc1 -ast-print foo.c) badly print this as 'b.b' because all the MemberExpr targeting anonymous types are simply ignored. The patch fix that behavior: the arrow/dot notation is printed if the base of the expression is not anonymous.

This looks reasonable to me, but could you include a test case (
http://llvm.org/docs/DeveloperPolicy.html#test-cases ). Probably the
easiest/best way would be to use -ast-print as you mentioned in your
description. If you search for "ast-print" in clang's test directory
you'll find a smattering of test cases that test ast print output. If
I had to guess where to put this one, I might consider putting it in
test/Sema/ast-print.c

> ---
>  lib/AST/StmtPrinter.cpp |   10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
>
>
> --
> Florent Bruneau
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list