From: Justin Bogner Date: Thu, 28 May 2015 22:19:36 +0000 (+0000) Subject: AST: Fix printing GNU old-style field designators X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=82ce1f7fbbcc72bd8878691e62c7157a8a474c2a;p=clang AST: Fix printing GNU old-style field designators Allows StmtPrinter to print old style field designators in initializers, fixing an issue where we would print the following invalid code: struct A a = {b: = 3, .c = 4}; Patch by Nick Sumner. Thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@238517 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index dc4f9964c7..cd65d72973 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -1395,13 +1395,16 @@ void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { } void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { + bool NeedsEquals = true; for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), DEnd = Node->designators_end(); D != DEnd; ++D) { if (D->isFieldDesignator()) { if (D->getDotLoc().isInvalid()) { - if (IdentifierInfo *II = D->getFieldName()) + if (IdentifierInfo *II = D->getFieldName()) { OS << II->getName() << ":"; + NeedsEquals = false; + } } else { OS << "." << D->getFieldName()->getName(); } @@ -1418,7 +1421,10 @@ void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { } } - OS << " = "; + if (NeedsEquals) + OS << " = "; + else + OS << " "; PrintExpr(Node->getInit()); } diff --git a/test/Sema/ast-print.c b/test/Sema/ast-print.c index 4b2b43190d..b4d76844fe 100644 --- a/test/Sema/ast-print.c +++ b/test/Sema/ast-print.c @@ -45,3 +45,11 @@ typedef struct { // CHECK: struct __attribute__((visibility("default"))) S; struct __attribute__((visibility("default"))) S; + +struct pair_t { + int a; + int b; +}; + +// CHECK: struct pair_t p = {a: 3, .b = 4}; +struct pair_t p = {a: 3, .b = 4};