[cfe-commits] r58207 - /cfe/trunk/lib/Parse/ParseInit.cpp

Chris Lattner sabre at nondot.org
Sun Oct 26 15:41:58 PDT 2008


Author: lattner
Date: Sun Oct 26 17:41:58 2008
New Revision: 58207

URL: http://llvm.org/viewvc/llvm-project?rev=58207&view=rev
Log:
improve MayBeDesignationStart to do the entire determination 
about whether a leading identifier is a designator.

Modified:
    cfe/trunk/lib/Parse/ParseInit.cpp

Modified: cfe/trunk/lib/Parse/ParseInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseInit.cpp?rev=58207&r1=58206&r2=58207&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseInit.cpp (original)
+++ cfe/trunk/lib/Parse/ParseInit.cpp Sun Oct 26 17:41:58 2008
@@ -21,13 +21,14 @@
 /// MayBeDesignationStart - Return true if this token might be the start of a
 /// designator.  If we can tell it is impossible that it is a designator, return
 /// false. 
-static bool MayBeDesignationStart(tok::TokenKind K) {
+static bool MayBeDesignationStart(tok::TokenKind K, Preprocessor &PP) {
   switch (K) {
   default: return false;
   case tok::period:      // designator: '.' identifier
   case tok::l_square:    // designator: array-designator
+      return true;
   case tok::identifier:  // designation: identifier ':'
-    return true;
+    return PP.LookAhead(0).is(tok::colon);
   }
 }
 
@@ -64,23 +65,17 @@
   // Handle it as a field designator.  Otherwise, this must be the start of a
   // normal expression.
   if (Tok.is(tok::identifier)) {
-    if (NextToken().is(tok::colon)) {
-      Diag(Tok, diag::ext_gnu_old_style_field_designator);
-
-      Designation &D = Designations.CreateDesignation(InitNum);
-      D.AddDesignator(Designator::getField(Tok.getIdentifierInfo()));
-      ConsumeToken(); // Eat the identifier.
-      
-      assert(Tok.is(tok::colon) && "NextToken() not working properly!");
-      ConsumeToken();
-      return ParseInitializer();
-    }
+    Diag(Tok, diag::ext_gnu_old_style_field_designator);
+    
+    Designation &D = Designations.CreateDesignation(InitNum);
+    D.AddDesignator(Designator::getField(Tok.getIdentifierInfo()));
+    ConsumeToken(); // Eat the identifier.
     
-    // Otherwise, parse the assignment-expression.
-    return ParseAssignmentExpression();
+    assert(Tok.is(tok::colon) && "NextToken() not working properly!");
+    ConsumeToken();
+    return ParseInitializer();
   }
   
-  
   // Parse each designator in the designator list until we find an initializer.
   while (1) {
     switch (Tok.getKind()) {
@@ -208,7 +203,7 @@
     // If we know that this cannot be a designation, just parse the nested
     // initializer directly.
     ExprResult SubElt;
-    if (!MayBeDesignationStart(Tok.getKind()))
+    if (!MayBeDesignationStart(Tok.getKind(), PP))
       SubElt = ParseInitializer();
     else
       SubElt = ParseInitializerWithPotentialDesignator(InitExprDesignations,





More information about the cfe-commits mailing list