From 53e4b55d2c534cfd59021ff18349ac58979ce43f Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 26 Oct 2010 17:18:00 +0000 Subject: [PATCH] Teach typo correction not to return the same keyword that matches a typo. This can happen with context-sensitive keywords like "super", when typo correction didn't know that "super" wasn't permitted in this context. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117372 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaLookup.cpp | 21 ++++++++++++++++++++- test/FixIt/typo.m | 9 +++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 67d22ee924..e36642cb7c 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -3181,10 +3181,14 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS, // Make sure that the user typed at least 3 characters for each correction // made. Otherwise, we don't even both looking at the results. + + // We also suppress exact matches; those should be handled by a + // different mechanism (e.g., one that introduces qualification in + // C++). unsigned ED = Consumer.getBestEditDistance(); if (ED > 0 && Typo->getName().size() / ED < 3) { // If this was an unqualified lookup, note that no correction was found. - if (IsUnqualifiedLookup) + if (IsUnqualifiedLookup && ED > 0) (void)UnqualifiedTyposCorrected[Typo]; return DeclarationName(); @@ -3244,6 +3248,14 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS, if (Consumer.begin()->second) { Res.suppressDiagnostics(); Res.clear(); + + // Don't correct to a keyword that's the same as the typo; the keyword + // wasn't actually in scope. + if (ED == 0) { + Res.setLookupName(Typo); + return DeclarationName(); + } + } else if (!LastLookupWasAccepted) { // Perform name lookup on this name. LookupPotentialTypoResult(*this, Res, Name, S, SS, MemberContext, @@ -3264,6 +3276,13 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS, Res.suppressDiagnostics(); Res.clear(); + // Don't correct to a keyword that's the same as the typo; the keyword + // wasn't actually in scope. + if (ED == 0) { + Res.setLookupName(Typo); + return DeclarationName(); + } + // Record the correction for unqualified lookup. if (IsUnqualifiedLookup) UnqualifiedTyposCorrected[Typo] diff --git a/test/FixIt/typo.m b/test/FixIt/typo.m index b8c57e46e3..559429a3c9 100644 --- a/test/FixIt/typo.m +++ b/test/FixIt/typo.m @@ -102,6 +102,7 @@ void test2(Collide *a) { @interface Super - (int)method; // expected-note{{using}} - (int)method2; +- (int)method3:(id)x; @end @interface Sub : Super @@ -155,3 +156,11 @@ void f(A *a) { [A methodA] // expected-error{{expected ';' after expression}} } +#ifdef NON_FIXITS +@implementation Sub3 +- (int)method2 { + int x = super; // expected-note{{use of undeclared identifier 'super'; did you mean 'Super'?}} + return 0; +} +@end +#endif -- 2.40.0