Make our diagnostics about the obsolete GNU designated-initializer
syntax into extension warnings, and provide code-modification hints
showing how to fix the problem.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67885 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp
index 3a42e50..7837a0c 100644
--- a/lib/Parse/ParseInit.cpp
+++ b/lib/Parse/ParseInit.cpp
@@ -64,14 +64,22 @@
   // Handle it as a field designator.  Otherwise, this must be the start of a
   // normal expression.
   if (Tok.is(tok::identifier)) {
-    Diag(Tok, diag::ext_gnu_old_style_field_designator);
-    
     const IdentifierInfo *FieldName = Tok.getIdentifierInfo();
+
+    std::string NewSyntax(".");
+    NewSyntax += FieldName->getName();
+    NewSyntax += " = ";
+
     SourceLocation NameLoc = ConsumeToken(); // Eat the identifier.
     
     assert(Tok.is(tok::colon) && "MayBeDesignationStart not working properly!");
     SourceLocation ColonLoc = ConsumeToken();
 
+    Diag(Tok, diag::ext_gnu_old_style_field_designator)
+      << CodeModificationHint::CreateReplacement(SourceRange(NameLoc, 
+                                                             ColonLoc),
+                                                 NewSyntax);
+
     Designation D;
     D.AddDesignator(Designator::getField(FieldName, SourceLocation(), NameLoc));
     return Actions.ActOnDesignatedInitializer(D, ColonLoc, true, 
@@ -209,8 +217,9 @@
   if (Desig.getNumDesignators() == 1 && 
       (Desig.getDesignator(0).isArrayDesignator() ||
        Desig.getDesignator(0).isArrayRangeDesignator())) {
-    Diag(Tok, diag::ext_gnu_missing_equal_designator);
-    return Actions.ActOnDesignatedInitializer(Desig, SourceLocation(),
+    Diag(Tok, diag::ext_gnu_missing_equal_designator)
+      << CodeModificationHint::CreateInsertion(Tok.getLocation(), "=");
+    return Actions.ActOnDesignatedInitializer(Desig, Tok.getLocation(),
                                               true, ParseInitializer());
   }