summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2012-11-12 19:12:12 +0000
committerDavid Blaikie <dblaikie@gmail.com>2012-11-12 19:12:12 +0000
commit8fab8e53fbe198e61ca671e54dc3afa63f63321c (patch)
tree281c87e0e29d93edd75024672d29762c975f8022
parent3c7fed87d2fcb675270f16587ba4b42518501621 (diff)
downloadbcm5719-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.cpp10
-rw-r--r--clang/test/Sema/ast-print.c14
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;
+}
OpenPOWER on IntegriCloud