aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseInit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
-rw-r--r--lib/Parse/ParseInit.cpp35
1 files changed, 26 insertions, 9 deletions
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp
index a7a5a6a3dc..1f5fa1cf8c 100644
--- a/lib/Parse/ParseInit.cpp
+++ b/lib/Parse/ParseInit.cpp
@@ -76,13 +76,28 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
return ParseInitializer();
}
+ // Desig - This is initialized when we see our first designator. We may have
+ // an objc message send with no designator, so we don't want to create this
+ // eagerly.
+ Designation *Desig = 0;
+
// Parse each designator in the designator list until we find an initializer.
while (Tok.is(tok::period) || Tok.is(tok::l_square)) {
if (Tok.is(tok::period)) {
// designator: '.' identifier
ConsumeToken();
- if (ExpectAndConsume(tok::identifier, diag::err_expected_ident))
+
+ // Create designation if we haven't already.
+ if (Desig == 0)
+ Desig = &Designations.CreateDesignation(InitNum);
+
+ if (Tok.isNot(tok::identifier)) {
+ Diag(Tok.getLocation(), diag::err_expected_field_designator);
return ExprResult(true);
+ }
+
+ Desig->AddDesignator(Designator::getField(Tok.getIdentifierInfo()));
+ ConsumeToken(); // Eat the identifier.
continue;
}
@@ -141,19 +156,21 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
MatchRHSPunctuation(tok::r_square, StartLoc);
}
+ // Okay, we're done with the designator sequence. We know that there must be
+ // at least one designator, because the only case we can get into this method
+ // without a designator is when we have an objc message send. That case is
+ // handled and returned from above.
+
+ // Handle a normal designator sequence end, which is an equal.
if (Tok.is(tok::equal)) {
- // We read some number (at least one due to the grammar we implemented)
- // of designators and found an '=' sign. The following tokens must be
- // the initializer.
ConsumeToken();
return ParseInitializer();
}
- // We read some number (at least one due to the grammar we implemented)
- // of designators and found something that isn't an = or an initializer.
- // If we have exactly one array designator [TODO CHECK], this is the GNU
- // 'designation: array-designator' extension. Otherwise, it is a parse
- // error.
+ // We read some number of designators and found something that isn't an = or
+ // an initializer. If we have exactly one array designator [TODO CHECK], this
+ // is the GNU 'designation: array-designator' extension. Otherwise, it is a
+ // parse error.
SourceLocation Loc = Tok.getLocation();
ExprResult Init = ParseInitializer();
if (Init.isInvalid) return Init;