[cfe-commits] r57809 - /cfe/trunk/lib/Parse/ParseObjc.cpp

Chris Lattner sabre at nondot.org
Mon Oct 20 00:00:43 PDT 2008


Author: lattner
Date: Mon Oct 20 02:00:43 2008
New Revision: 57809

URL: http://llvm.org/viewvc/llvm-project?rev=57809&view=rev
Log:
significantly simplify and clean up error recovery in 
ParseObjCPropertyAttribute.  Before, on this code (where
a comma was forgotten):

@property (readonly getter=isAwesome) int _awesome;

we emitted:

crash.m:9:11: error: expected ')'
@property (readonly getter=isAwesome) int _awesome;
          ^
crash.m:9:37: error: type name requires a specifier or qualifier
@property (readonly getter=isAwesome) int _awesome;
                                    ^
crash.m:9:37: error: expected identifier or '('
crash.m:9:37: error: expected ';' at end of declaration list
crash.m:9:1: error: @property requires fields to be named
@property (readonly getter=isAwesome) int _awesome;
^

now we emit:

crash.m:9:21: error: expected ')'
@property (readonly getter=isAwesome) int _awesome;
                    ^
crash.m:9:11: error: to match this '('
@property (readonly getter=isAwesome) int _awesome;
          ^


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

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

==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon Oct 20 02:00:43 2008
@@ -301,10 +301,9 @@
     case tok::objc_property:
       ObjCDeclSpec OCDS;
       // Parse property attribute list, if any. 
-      if (Tok.is(tok::l_paren)) {
-        // property has attribute list.
+      if (Tok.is(tok::l_paren))
         ParseObjCPropertyAttribute(OCDS);
-      }
+        
       // Parse all the comma separated declarators.
       DeclSpec DS;
       llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
@@ -376,7 +375,8 @@
 ///     nonatomic
 ///
 void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
-  SourceLocation loc = ConsumeParen(); // consume '('
+  SourceLocation LHSLoc = ConsumeParen(); // consume '('
+  
   while (isObjCPropertyAttribute()) {
     const IdentifierInfo *II = Tok.getIdentifierInfo();
     // getter/setter require extra treatment.
@@ -394,28 +394,24 @@
             if (Tok.isNot(tok::colon)) {
               Diag(loc, diag::err_expected_colon);
               SkipUntil(tok::r_paren,true,true);
-              break;
+              return;
             }
-          }
-          else {
+          } else {
             DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_getter);
             DS.setGetterName(Tok.getIdentifierInfo());
           }
-        }
-        else {
+        } else {
           Diag(loc, diag::err_expected_ident);
           SkipUntil(tok::r_paren,true,true);
-          break;
+          return;
         }
       }
       else {
         Diag(loc, diag::err_objc_expected_equal);    
         SkipUntil(tok::r_paren,true,true);
-        break;
+        return;
       }
-    }
-    
-    else if (II == ObjCPropertyAttrs[objc_readonly])
+    } else if (II == ObjCPropertyAttrs[objc_readonly])
       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readonly);
     else if (II == ObjCPropertyAttrs[objc_assign])
       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_assign);
@@ -430,21 +426,18 @@
     
     ConsumeToken(); // consume last attribute token
     if (Tok.is(tok::comma)) {
-      loc = ConsumeToken();
+      ConsumeToken();
       continue;
     }
-    if (Tok.is(tok::r_paren))
-      break;
-    Diag(loc, diag::err_expected_rparen);
-    SkipUntil(tok::semi);
+    
+    if (Tok.is(tok::r_paren)) {
+      ConsumeParen();
+      return;
+    }
+    
+    MatchRHSPunctuation(tok::r_paren, LHSLoc);
     return;
   }
-  if (Tok.is(tok::r_paren))
-    ConsumeParen();
-  else {
-    Diag(loc, diag::err_objc_expected_property_attr);
-    SkipUntil(tok::r_paren); // recover from error inside attribute list
-  }
 }
 
 ///   objc-method-proto:





More information about the cfe-commits mailing list