diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/ASTContext.cpp | 1 | ||||
-rw-r--r-- | lib/AST/Expr.cpp | 2 | ||||
-rw-r--r-- | lib/Parse/ParseInit.cpp | 17 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 2 | ||||
-rw-r--r-- | lib/Sema/SemaInit.cpp | 4 |
5 files changed, 17 insertions, 9 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 2fc6a7d527..da6e049732 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -89,7 +89,6 @@ ASTContext::~ASTContext() { GlobalNestedNameSpecifier->Destroy(*this); TUDecl->Destroy(*this); - } void ASTContext::PrintStats() const { diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 92310902e2..08ab5440b1 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1534,7 +1534,7 @@ SourceRange DesignatedInitExpr::getSourceRange() const { Designator &First = *const_cast<DesignatedInitExpr*>(this)->designators_begin(); if (First.isFieldDesignator()) { - if (UsesColonSyntax) + if (GNUSyntax) StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); else StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 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()); } diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 8dee4f19a2..76740e8dd9 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1285,7 +1285,7 @@ public: virtual OwningExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation Loc, - bool UsedColonSyntax, + bool GNUSyntax, OwningExprResult Init); virtual OwningExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 600dc34351..fbf3ae2a78 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -1548,7 +1548,7 @@ CheckArrayDesignatorExpr(Sema &Self, Expr *Index, llvm::APSInt &Value) { Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, SourceLocation Loc, - bool UsedColonSyntax, + bool GNUSyntax, OwningExprResult Init) { typedef DesignatedInitExpr::Designator ASTDesignator; @@ -1622,7 +1622,7 @@ Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, DesignatedInitExpr *DIE = DesignatedInitExpr::Create(Context, &Designators[0], Designators.size(), &InitExpressions[0], InitExpressions.size(), - Loc, UsedColonSyntax, + Loc, GNUSyntax, static_cast<Expr *>(Init.release())); return Owned(DIE); } |