]> granicus.if.org Git - clang/commitdiff
When performing typo correction, keep track of whether the last lookup
authorDouglas Gregor <dgregor@apple.com>
Fri, 15 Oct 2010 16:49:56 +0000 (16:49 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 15 Oct 2010 16:49:56 +0000 (16:49 +0000)
we did was an acceptable lookup. If it is, then we can re-use that
lookup result. If it isn't, we have to perform the lookup again. This
is almost surely the cause behind the mysterious typo.m failures on
some builders; we were getting the wrong lookup results returned.

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

lib/Sema/SemaLookup.cpp
test/FixIt/typo.m
test/SemaObjC/synth-provisional-ivars.m

index 9056e79574edf0784fd64c3620bd4bfb022435c3..6cd0207c80050184100841fa07f78a312a3c546e 100644 (file)
@@ -3051,6 +3051,7 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
     return DeclarationName();
 
   // Weed out any names that could not be found by name lookup.
+  bool LastLookupWasAccepted = false;
   for (TypoCorrectionConsumer::iterator I = Consumer.begin(), 
                                      IEnd = Consumer.end();
        I != IEnd; /* Increment in loop. */) {
@@ -3103,12 +3104,14 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
         Consumer.erase(I);
         I = Next;
       }
+      LastLookupWasAccepted = false;
       break;      
         
     case LookupResult::Found:
     case LookupResult::FoundOverloaded:
     case LookupResult::FoundUnresolvedValue:
       ++I;
+      LastLookupWasAccepted = false;
       break;
     }
     
@@ -3121,8 +3124,41 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
   }
 
   // If only a single name remains, return that result.
-  if (Consumer.size() == 1)
+  if (Consumer.size() == 1) {
+    IdentifierInfo *Name = &Context.Idents.get(Consumer.begin()->getKey());
+    if (!LastLookupWasAccepted) {
+      // Perform name lookup on this name.
+      Res.suppressDiagnostics();
+      Res.clear();
+      Res.setLookupName(Name);
+      if (MemberContext)
+        LookupQualifiedName(Res, MemberContext);
+      else {
+        LookupParsedName(Res, S, SS, /*AllowBuiltinCreation=*/false, 
+                         EnteringContext);
+
+        // Fake ivar lookup; this should really be part of
+        // LookupParsedName.
+        if (ObjCMethodDecl *Method = getCurMethodDecl()) {
+          if (Method->isInstanceMethod() && Method->getClassInterface() &&
+              (Res.empty() || 
+               (Res.isSingleResult() &&
+                Res.getFoundDecl()->isDefinedOutsideFunctionOrMethod()))) {
+            ObjCInterfaceDecl *ClassDeclared = 0;
+            if (ObjCIvarDecl *IV 
+                = Method->getClassInterface()->lookupInstanceVariable(Name, 
+                                                              ClassDeclared)) {
+              Res.clear();
+              Res.addDecl(IV);
+              Res.resolveKind();
+            }
+          }
+        }
+      }
+    }
+
     return &Context.Idents.get(Consumer.begin()->getKey());  
+  }
   else if (Consumer.size() > 1 && CTC == CTC_ObjCMessageReceiver 
            && Consumer["super"]) {
     // Prefix 'super' when we're completing in a message-receiver
index 0be21a0fe2e3ed22476370ad3cedcdf670cef5ee..b8c57e46e3b89bbf46e6165a0d1d09f7b6ed0024 100644 (file)
@@ -2,9 +2,6 @@
 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -x objective-c -E -P %s -o %t
 // RUN: %clang_cc1 -x objective-c -fsyntax-only -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -fixit %t  || true
 // RUN: %clang_cc1 -x objective-c -fsyntax-only -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -pedantic -Werror %t
-//
-// FIXME: Disabled while we investigate failure.
-// REQUIRES: disabled
 
 @interface NSString // expected-note{{'NSString' declared here}}
 + (int)method:(int)x;
index 8ad2233ba4a80f59cdeb0899ea1d4b87114f723b..10fdbdccb23b6894ba302115e46ee971544888fc 100644 (file)
@@ -18,7 +18,7 @@ int bar;
 @end
 
 @implementation I
-- (int) Meth { return PROP; }
+- (int) Meth { return PROP; } // expected-note{{'PROP' declared here}}
 
 @dynamic PROP1;
 - (int) Meth1 { return PROP1; }  // expected-error {{use of undeclared identifier 'PROP1'}}