[cfe-commits] r85056 - in /cfe/trunk: include/clang/Basic/DiagnosticParseKinds.td lib/Parse/ParseExpr.cpp lib/Sema/SemaDecl.cpp

Chris Lattner sabre at nondot.org
Sun Oct 25 10:04:49 PDT 2009


Author: lattner
Date: Sun Oct 25 12:04:48 2009
New Revision: 85056

URL: http://llvm.org/viewvc/llvm-project?rev=85056&view=rev
Log:
In objc mode, every identifier in a cast expression was using doing a
type looking using getTypeName() and every property access was using
NextToken() to do lookahead to see if the identifier is followed by
a '.'.  Rearrange this code to not need lookahead and only do the
type lookup if we have "identifier." in the token stream.  Also
improve a diagnostic a bit.


Modified:
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/lib/Parse/ParseExpr.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=85056&r1=85055&r2=85056&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Sun Oct 25 12:04:48 2009
@@ -126,6 +126,7 @@
   "expected string literal or '[' for asm operand">;
 def err_expected_selector_for_method : Error<
   "expected selector for Objective-C method">;
+def err_expected_property_name : Error<"expected property name">;
 
 def err_unexpected_at : Error<"unexpected '@' in program">;
 

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

==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Sun Oct 25 12:04:48 2009
@@ -623,36 +623,35 @@
         return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
     }
 
-    // Support 'Class.property' notation.
-    // We don't use isTokObjCMessageIdentifierReceiver(), since it allows
-    // 'super' (which is inappropriate here).
-    if (getLang().ObjC1 &&
-        Actions.getTypeName(*Tok.getIdentifierInfo(),
-                            Tok.getLocation(), CurScope) &&
-        NextToken().is(tok::period)) {
-      IdentifierInfo &ReceiverName = *Tok.getIdentifierInfo();
-      SourceLocation IdentLoc = ConsumeToken();
+    // Consume the identifier so that we can see if it is followed by a '(' or
+    // '.'.
+    IdentifierInfo &II = *Tok.getIdentifierInfo();
+    SourceLocation ILoc = ConsumeToken();
+    
+    // Support 'Class.property' notation.  We don't use
+    // isTokObjCMessageIdentifierReceiver(), since it allows 'super' (which is
+    // inappropriate here).
+    if (getLang().ObjC1 && Tok.is(tok::period) &&
+        Actions.getTypeName(II, ILoc, CurScope)) {
       SourceLocation DotLoc = ConsumeToken();
-
+      
       if (Tok.isNot(tok::identifier)) {
-        Diag(Tok, diag::err_expected_ident);
+        Diag(Tok, diag::err_expected_property_name);
         return ExprError();
       }
       IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
       SourceLocation PropertyLoc = ConsumeToken();
-
-      Res = Actions.ActOnClassPropertyRefExpr(ReceiverName, PropertyName,
-                                              IdentLoc, PropertyLoc);
+      
+      Res = Actions.ActOnClassPropertyRefExpr(II, PropertyName,
+                                              ILoc, PropertyLoc);
       // These can be followed by postfix-expr pieces.
       return ParsePostfixExpressionSuffix(move(Res));
     }
-    // Consume the identifier so that we can see if it is followed by a '('.
+   
     // Function designators are allowed to be undeclared (C99 6.5.1p2), so we
     // need to know whether or not this identifier is a function designator or
     // not.
-    IdentifierInfo &II = *Tok.getIdentifierInfo();
-    SourceLocation L = ConsumeToken();
-    Res = Actions.ActOnIdentifierExpr(CurScope, L, II, Tok.is(tok::l_paren));
+    Res = Actions.ActOnIdentifierExpr(CurScope, ILoc, II, Tok.is(tok::l_paren));
     // These can be followed by postfix-expr pieces.
     return ParsePostfixExpressionSuffix(move(Res));
   }

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=85056&r1=85055&r2=85056&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sun Oct 25 12:04:48 2009
@@ -142,7 +142,7 @@
     QualType T;
 
     if (TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
-      // Check whether we can use this type
+      // Check whether we can use this type.
       (void)DiagnoseUseOfDecl(IIDecl, NameLoc);
 
       if (getLangOptions().CPlusPlus) {





More information about the cfe-commits mailing list