diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-26 22:59:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-26 22:59:19 +0000 |
commit | 0a68b9449136b0d5664bfa48a51a0c1181d2eca8 (patch) | |
tree | adff4daa3a3e5bbe838dcdd4b8f740c1ec064172 /lib/Parse/ParseInit.cpp | |
parent | 7f9690d79f04b405f9e41e98f2e2698ffd640c8e (diff) |
improve comments, build a Designation for field designators and
improve diagnostic for a malformed field designator.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58212 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
-rw-r--r-- | lib/Parse/ParseInit.cpp | 35 |
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; |