]> granicus.if.org Git - clang/commitdiff
Tweak typo-correction logic a bit regarding "super", so that we
authorDouglas Gregor <dgregor@apple.com>
Tue, 18 May 2010 16:14:23 +0000 (16:14 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 18 May 2010 16:14:23 +0000 (16:14 +0000)
consider "super" as a candidate whenever we're parsing an expression
within an Objective-C method in an interface that has a superclass. At
some point, we'd like to give "super" a little edge over non-local
names; that will come later.

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

lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp
lib/Sema/SemaLookup.cpp
lib/Sema/SemaOverload.cpp
test/FixIt/typo.m

index a7d242c559b54fc80e1f85f891bd5cd4f9b119f6..975516ff9a323bd599978c90655d1216941600a7 100644 (file)
@@ -1811,7 +1811,8 @@ public:
                                              bool HasTrailingLParen,
                                              bool IsAddressOfOperand);
 
-  bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R);
+  bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
+                           CorrectTypoContext CTC = CTC_Unknown);
 
   OwningExprResult LookupInObjCMethod(LookupResult &R,
                                       Scope *S,
index 5af5585f7f815b387c683010817a10bd674469d9..8bc3d063b1d95bc9eddf161de6f8dd9505fccaa5 100644 (file)
@@ -917,7 +917,7 @@ static void DiagnoseInstanceReference(Sema &SemaRef,
 ///
 /// \return false if new lookup candidates were found
 bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS,
-                               LookupResult &R) {
+                               LookupResult &R, CorrectTypoContext CTC) {
   DeclarationName Name = R.getLookupName();
 
   unsigned diagnostic = diag::err_undeclared_var_use;
@@ -968,7 +968,7 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS,
 
   // We didn't find anything, so try to correct for a typo.
   DeclarationName Corrected;
-  if (S && (Corrected = CorrectTypo(R, S, &SS))) {
+  if (S && (Corrected = CorrectTypo(R, S, &SS, false, CTC))) {
     if (!R.empty()) {
       if (isa<ValueDecl>(*R.begin()) || isa<FunctionTemplateDecl>(*R.begin())) {
         if (SS.isEmpty())
@@ -1122,7 +1122,7 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S,
     // If this name wasn't predeclared and if this is not a function
     // call, diagnose the problem.
     if (R.empty()) {
-      if (DiagnoseEmptyLookup(S, SS, R))
+      if (DiagnoseEmptyLookup(S, SS, R, CTC_Unknown))
         return ExprError();
 
       assert(!R.empty() &&
index 31c33e963ca7b47c945f41b18b057521b2b82232..62b0ea149b796f5239381e7f42cb6f54fda13972 100644 (file)
@@ -2612,6 +2612,12 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
       WantExpressionKeywords = true;
       WantCXXNamedCasts = true;
       WantRemainingKeywords = true;
+      
+      if (ObjCMethodDecl *Method = getCurMethodDecl())
+        if (Method->getClassInterface() &&
+            Method->getClassInterface()->getSuperClass())
+          Consumer.addKeywordResult(Context, "super");
+      
       break;
   
     case CTC_NoKeywords:
index 15f19723f8960a1909cbad06f02d3a0c31926130..4c48e6159c4b13da6d90b759e8dbcc08fc5b7019 100644 (file)
@@ -6002,7 +6002,7 @@ BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn,
 
   LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
                  Sema::LookupOrdinaryName);
-  if (SemaRef.DiagnoseEmptyLookup(S, SS, R))
+  if (SemaRef.DiagnoseEmptyLookup(S, SS, R, Sema::CTC_Expression))
     return Destroy(SemaRef, Fn, Args, NumArgs);
 
   assert(!R.empty() && "lookup results empty despite recovery");
index 2ee6831da6fc178411d10ddcbc3a457142a3a7a7..3b73a2a33b612f2741e082016c0ed0e0b8e72f19 100644 (file)
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -DNON_FIXITS -verify %s
 // RUN: %clang -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 -fixit %t  || true
 // RUN: %clang_cc1 -x objective-c -fsyntax-only -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -pedantic -Werror %t
 
 @interface NSString // expected-note{{'NSString' declared here}}
@@ -97,6 +97,7 @@ void test2(Collide *a) {
 
 @interface Super
 - (int)method; // expected-note{{using}}
+- (int)method2;
 @end
 
 @interface Sub : Super
@@ -110,6 +111,20 @@ void test2(Collide *a) {
   
 @end
 
+#ifdef NON_FIXITS
+double *isupper(int);
+
+@interface Sub2 : Super
+- (int)method2;
+@end
+
+@implementation Sub2
+- (int)method2 {
+  return [supper method2]; // expected-error{{use of undeclared identifier 'supper'}}
+}
+@end
+#endif
+
 @interface Ivar
 @end