[cfe-commits] r93271 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaExpr.cpp test/SemaObjC/ivar-lookup-resolution-builtin.m

Fariborz Jahanian fjahanian at apple.com
Tue Jan 12 15:58:59 PST 2010


Author: fjahanian
Date: Tue Jan 12 17:58:59 2010
New Revision: 93271

URL: http://llvm.org/viewvc/llvm-project?rev=93271&view=rev
Log:
When in objective-c methods, do the built-in name lookup after
ivar name lookup. Fixes pr5986.

Added:
    cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m
Modified:
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=93271&r1=93270&r2=93271&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Tue Jan 12 17:58:59 2010
@@ -1481,7 +1481,8 @@
 
   OwningExprResult LookupInObjCMethod(LookupResult &R,
                                       Scope *S,
-                                      IdentifierInfo *II);
+                                      IdentifierInfo *II,
+                                      bool AllowBuiltinCreation=false);
 
   OwningExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS,
                                               DeclarationName Name,

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

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 12 17:58:59 2010
@@ -1033,12 +1033,13 @@
     // Just re-use the lookup done by isTemplateName.
     DecomposeTemplateName(R, Id);
   } else {
-    LookupParsedName(R, S, &SS, true);
+    bool IvarLookupFollowUp = (!SS.isSet() && II && getCurMethodDecl());
+    LookupParsedName(R, S, &SS, !IvarLookupFollowUp);
 
     // If this reference is in an Objective-C method, then we need to do
     // some special Objective-C lookup, too.
-    if (!SS.isSet() && II && getCurMethodDecl()) {
-      OwningExprResult E(LookupInObjCMethod(R, S, II));
+    if (IvarLookupFollowUp) {
+      OwningExprResult E(LookupInObjCMethod(R, S, II, true));
       if (E.isInvalid())
         return ExprError();
 
@@ -1218,7 +1219,8 @@
 /// Returns a null sentinel to indicate trivial success.
 Sema::OwningExprResult
 Sema::LookupInObjCMethod(LookupResult &Lookup, Scope *S,
-                         IdentifierInfo *II) {
+                         IdentifierInfo *II,
+                         bool AllowBuiltinCreation) {
   SourceLocation Loc = Lookup.getNameLoc();
 
   // There are two cases to handle here.  1) scoped lookup could have failed,
@@ -1299,7 +1301,18 @@
       T = Context.getObjCClassType();
     return Owned(new (Context) ObjCSuperExpr(Loc, T));
   }
-
+  if (Lookup.empty() && II && AllowBuiltinCreation) {
+    // FIXME. Consolidate this with similar code in LookupName.
+    if (unsigned BuiltinID = II->getBuiltinID()) {
+      if (!(getLangOptions().CPlusPlus &&
+            Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))) {
+        NamedDecl *D = LazilyCreateBuiltin((IdentifierInfo *)II, BuiltinID,
+                                           S, Lookup.isForRedeclaration(),
+                                           Lookup.getNameLoc());
+        if (D) Lookup.addDecl(D);
+      }
+    }
+  }
   // Sentinel value saying that we didn't do anything special.
   return Owned((Expr*) 0);
 }

Added: cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m?rev=93271&view=auto

==============================================================================
--- cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m (added)
+++ cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m Tue Jan 12 17:58:59 2010
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1  -fsyntax-only -verify %s
+// pr5986
+
+ at interface Test {
+  int index;
+}
+- (int) index;
++ (int) ClassMethod;
+ at end
+
+ at implementation Test
+- (int) index
+{
+  return index;
+}
++ (int) ClassMethod
+{
+  return index;	// expected-error {{instance variable 'index' accessed in class method}}
+}
+ at end
+
+ at interface Test1 {
+}
+- (int) InstMethod;
++ (int) ClassMethod;
+ at end
+
+ at implementation Test1
+- (int) InstMethod
+{
+  return index;	// expected-warning {{implicitly declaring C library function 'index'}}	\
+                // expected-note {{please include the header <strings.h> or explicitly provide a declaration for 'index'}} \
+                // expected-warning {{incompatible pointer to integer conversion returning}}
+}
++ (int) ClassMethod
+{
+  return index; // expected-warning {{incompatible pointer to integer conversion returning}}
+}
+ at end
+





More information about the cfe-commits mailing list