]> granicus.if.org Git - clang/commitdiff
improve comments, build a Designation for field designators and
authorChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 22:59:19 +0000 (22:59 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 22:59:19 +0000 (22:59 +0000)
improve diagnostic for a malformed field designator.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58212 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticKinds.def
lib/Parse/ParseInit.cpp

index 7255e6a483b080b8b79d386b018cab0dd1b0a2c3..96a5d0053d81b5009028ca334d86a4a91031eefc 100644 (file)
@@ -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")
index a7a5a6a3dc99b09823b1d1ca200a989ba42f2900..1f5fa1cf8c0505c1bd0d04fdae1592e7d1899463 100644 (file)
@@ -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;