diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-28 00:41:23 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-28 00:41:23 +0000 |
commit | eeae8f072748affce25ab4064982626361293390 (patch) | |
tree | 8b63c859fe464f62acca8b40e8b29ad56492c324 /lib/Parse/ParseInit.cpp | |
parent | f2390367a0771b9118dc5c1b4b832ae84f2be897 (diff) |
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
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
-rw-r--r-- | lib/Parse/ParseInit.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index 3a42e50a9c..7837a0c7fd 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -64,14 +64,22 @@ Parser::OwningExprResult Parser::ParseInitializerWithPotentialDesignator() { // 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 @@ Parser::OwningExprResult Parser::ParseInitializerWithPotentialDesignator() { 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()); } |