]> granicus.if.org Git - clang/commitdiff
Teach typo correction not to return the same keyword that matches a
authorDouglas Gregor <dgregor@apple.com>
Tue, 26 Oct 2010 17:18:00 +0000 (17:18 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 26 Oct 2010 17:18:00 +0000 (17:18 +0000)
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
test/FixIt/typo.m

index 67d22ee924197d97e341cef31c3b9c51e5a1d389..e36642cb7cc2b77fa7170233f8dacc2b3cba8f9e 100644 (file)
@@ -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]
index b8c57e46e3b89bbf46e6165a0d1d09f7b6ed0024..559429a3c95a0349e21dccf5637f43db47278566 100644 (file)
@@ -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