diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-11-12 19:12:12 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-11-12 19:12:12 +0000 |
commit | 8fab8e53fbe198e61ca671e54dc3afa63f63321c (patch) | |
tree | 281c87e0e29d93edd75024672d29762c975f8022 | |
parent | 3c7fed87d2fcb675270f16587ba4b42518501621 (diff) | |
download | bcm5719-llvm-8fab8e53fbe198e61ca671e54dc3afa63f63321c.tar.gz bcm5719-llvm-8fab8e53fbe198e61ca671e54dc3afa63f63321c.zip |
Correct printing of nested anonymous type member accesses.
Patch by Florent Bruneau!
llvm-svn: 167736
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 10 | ||||
-rw-r--r-- | clang/test/Sema/ast-print.c | 14 |
2 files changed, 22 insertions, 2 deletions
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 57eb1a95181..31a9726e87b 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -910,10 +910,18 @@ void StmtPrinter::VisitCallExpr(CallExpr *Call) { void StmtPrinter::VisitMemberExpr(MemberExpr *Node) { // FIXME: Suppress printing implicit bases (like "this") PrintExpr(Node->getBase()); + + MemberExpr *ParentMember = dyn_cast<MemberExpr>(Node->getBase()); + FieldDecl *ParentDecl = ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl()): NULL; + + if (!ParentDecl || !ParentDecl->isAnonymousStructOrUnion()) { + OS << (Node->isArrow() ? "->" : "."); + } + if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) if (FD->isAnonymousStructOrUnion()) return; - OS << (Node->isArrow() ? "->" : "."); + if (NestedNameSpecifier *Qualifier = Node->getQualifier()) Qualifier->print(OS, Policy); if (Node->hasTemplateKeyword()) diff --git a/clang/test/Sema/ast-print.c b/clang/test/Sema/ast-print.c index ff66d35a1ba..2066e182c12 100644 --- a/clang/test/Sema/ast-print.c +++ b/clang/test/Sema/ast-print.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -ast-print +// RUN: %clang_cc1 %s -ast-print | FileCheck %s typedef void func_typedef(); func_typedef xxx; @@ -6,3 +6,15 @@ func_typedef xxx; typedef void func_t(int x); func_t a; +struct blah { + struct { + struct { + int b; + }; + }; +}; + +int foo(const struct blah *b) { + // CHECK: return b->b; + return b->b; +} |