]> granicus.if.org Git - clang/commitdiff
In objc mode, every identifier in a cast expression was using doing a
authorChris Lattner <sabre@nondot.org>
Sun, 25 Oct 2009 17:04:48 +0000 (17:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 25 Oct 2009 17:04:48 +0000 (17:04 +0000)
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.

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

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseExpr.cpp
lib/Sema/SemaDecl.cpp

index a7f3441e30160a8be1206410eb6efabb690dd9a1..add979a199106a58c326b97028cbee65d2d9fc2c 100644 (file)
@@ -126,6 +126,7 @@ def err_expected_asm_operand : Error<
   "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">;
 
index 7d056fdebb9165cb4bb59b0e93b1ddee1d76e292..8ebb7c01d85ff37b952fa239eadb7cd1f341fd98 100644 (file)
@@ -623,36 +623,35 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
         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));
   }
index fe8052981f2c124522fba8e9c3909d6cf7c632cd..4858321d51edec222953306e7738339e3ac48b10 100644 (file)
@@ -142,7 +142,7 @@ Sema::TypeTy *Sema::getTypeName(IdentifierInfo &II, SourceLocation NameLoc,
     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) {