aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/ASTContext.cpp1
-rw-r--r--lib/AST/Expr.cpp2
-rw-r--r--lib/Parse/ParseInit.cpp17
-rw-r--r--lib/Sema/Sema.h2
-rw-r--r--lib/Sema/SemaInit.cpp4
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);
}