]> granicus.if.org Git - clang/commitdiff
Correct printing of nested anonymous type member accesses.
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 12 Nov 2012 19:12:12 +0000 (19:12 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 12 Nov 2012 19:12:12 +0000 (19:12 +0000)
Patch by Florent Bruneau!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167736 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/StmtPrinter.cpp
test/Sema/ast-print.c

index 57eb1a95181c073414c8b527920b738502e0154d..31a9726e87bda14bdedd674a39315b3d23ee7be9 100644 (file)
@@ -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())
index ff66d35a1ba6d9c6914022159936dd4233550700..2066e182c12da6588f416e881acc60931b80965c 100644 (file)
@@ -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;
+}