Revised patch attached.

Nick


On Wed, May 27, 2015 at 8:18 PM, Justin Bogner <[email protected]> wrote:
> Nick Sumner <[email protected]> writes:
>> Hi all,
>>
>> The attached patch allows StmtPrinter to print old style field
>> designators in initializers. Given the code:
>> struct A { int b; int c; };
>> struct A a = {b: 3, .c = 4};
>>
>> The initializer is presently printed as:
>> struct A a = {b: = 3, .c = 4};
>>
>> The combination of ':' and '=' is invalid.
>>
>> With the patch, the initializer is printed as:
>> struct A a = {b: 3, .c = 4};
>
> Looks pretty good. Could you convert the test to one that runs as part
> of make check? You can probably add something to test/Sema/ast-print.c,
> or at least use that test as an example.
>
>> Best,
>> Nick
>>
>> Index: lib/AST/StmtPrinter.cpp
>> ===================================================================
>> --- lib/AST/StmtPrinter.cpp   (revision 238263)
>> +++ lib/AST/StmtPrinter.cpp   (working copy)
>> @@ -1395,13 +1395,16 @@
>>  }
>>
>>  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 @@
>>      }
>>    }
>>
>> -  OS << " = ";
>> +  if (needsEquals)
>> +    OS << " = ";
>> +  else
>> +    OS << " ";
>>    PrintExpr(Node->getInit());
>>  }
>>
>>
>>
>> struct A { int b; int c; };
>> struct A a = {b: 3, .c = 4};
>>
>> struct D { struct A d[10]; struct A e[10]; };
>> struct D d = { .d[5].c = 3,  e: { [5].c = 4 } };
>> // e:[5].c is invalid syntax
>>
>> _______________________________________________
>> cfe-commits mailing list
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
Index: lib/AST/StmtPrinter.cpp
===================================================================
--- lib/AST/StmtPrinter.cpp	(revision 238393)
+++ lib/AST/StmtPrinter.cpp	(working copy)
@@ -1395,13 +1395,16 @@
 }
 
 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 @@
     }
   }
 
-  OS << " = ";
+  if (NeedsEquals)
+    OS << " = ";
+  else
+    OS << " ";
   PrintExpr(Node->getInit());
 }
 
Index: test/Sema/ast-print.c
===================================================================
--- test/Sema/ast-print.c	(revision 238393)
+++ test/Sema/ast-print.c	(working copy)
@@ -45,3 +45,12 @@
 
 // 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};
+
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to