From: Chris Lattner Date: Sun, 26 Oct 2008 22:59:19 +0000 (+0000) Subject: improve comments, build a Designation for field designators and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a68b9449136b0d5664bfa48a51a0c1181d2eca8;p=clang 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 --- diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index 7255e6a483..96a5d0053d 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -961,6 +961,8 @@ DIAG(err_offsetof_array_type, ERROR, "offsetof requires array type, '%0' invalid") DIAG(ext_offsetof_extended_field_designator, EXTENSION, "using extended field designator is an extension") +DIAG(err_expected_field_designator, ERROR, + "expected a field designator, such as '.field = 4'") DIAG(err_invalid_suffix_integer_constant, ERROR, "invalid suffix '%0' on integer constant") 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;