diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-10-15 16:49:56 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-10-15 16:49:56 +0000 |
commit | 6eaac8b3e68177f56090ddb0fcfc8fbfd49150a6 (patch) | |
tree | f1f18cabcee74fcc891b68e8b8e878b4c761d6f8 | |
parent | 8712930d4fbb4d97c872157df49bf66255bb583a (diff) |
When performing typo correction, keep track of whether the last lookup
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
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 38 | ||||
-rw-r--r-- | test/FixIt/typo.m | 3 | ||||
-rw-r--r-- | test/SemaObjC/synth-provisional-ivars.m | 2 |
3 files changed, 38 insertions, 5 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 9056e79574..6cd0207c80 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -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 diff --git a/test/FixIt/typo.m b/test/FixIt/typo.m index 0be21a0fe2..b8c57e46e3 100644 --- a/test/FixIt/typo.m +++ b/test/FixIt/typo.m @@ -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; diff --git a/test/SemaObjC/synth-provisional-ivars.m b/test/SemaObjC/synth-provisional-ivars.m index 8ad2233ba4..10fdbdccb2 100644 --- a/test/SemaObjC/synth-provisional-ivars.m +++ b/test/SemaObjC/synth-provisional-ivars.m @@ -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'}} |