On Thu, Mar 14, 2013 at 3:56 PM, Argyrios Kyrtzidis <span dir="ltr"><<a href="mailto:akyrtzi@gmail.com" target="_blank">akyrtzi@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: akirtzidis<br>
Date: Thu Mar 14 17:56:43 2013<br>
New Revision: 177126<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=177126&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=177126&view=rev</a><br>
Log:<br>
Don't try to typo-correct 'super' in an objc method.<br>
<br>
This created 2 issues:<br>
<br>
1) Performance issue, since typo-correction with PCH/modules is rather expensive.<br>
2) Correctness issue, since if it managed to "correct" 'super' then bogus compiler errors would<br>
be emitted, like this:<br>
<br>
3.m:8:3: error: unknown type name 'super'; did you mean 'super1'?<br>
  super.x = 0;<br>
  ^~~~~<br>
  super1<br>
t3.m:5:13: note: 'super1' declared here<br>
typedef int super1;<br>
            ^<br>
t3.m:8:8: error: expected identifier or '('<br>
  super.x = 0;<br>
       ^<br></blockquote><div><br></div><div>Could you use this as a test case, instead of adding a diagnostic? (I would expect those folks using -Weverything will find the new diagnostic rather confusing...)</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Added:<br>
    cfe/trunk/test/SemaObjC/typo-correction.m<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/include/clang/Sema/Sema.h<br>
    cfe/trunk/lib/Sema/Sema.cpp<br>
    cfe/trunk/lib/Sema/SemaCodeComplete.cpp<br>
    cfe/trunk/lib/Sema/SemaLookup.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=177126&r1=177125&r2=177126&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=177126&r1=177125&r2=177126&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 14 17:56:43 2013<br>
@@ -6074,6 +6074,8 @@ def warn_direct_ivar_access : Warning<"i<br>
   "directly accessed">, InGroup<DiagGroup<"direct-ivar-access">>, DefaultIgnore;<br>
<br>
 // Spell-checking diagnostics<br>
+def warn_spellcheck_initiated : Warning<"spell-checking initiated for %0">,<br>
+  InGroup<DiagGroup<"spellcheck">>, DefaultIgnore;<br>
 def err_unknown_type_or_class_name_suggest : Error<<br>
   "unknown %select{type|class}2 name %0; did you mean %1?">;<br>
 def err_unknown_typename_suggest : Error<<br>
<br>
Modified: cfe/trunk/include/clang/Sema/Sema.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=177126&r1=177125&r2=177126&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=177126&r1=177125&r2=177126&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Sema/Sema.h (original)<br>
+++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 14 17:56:43 2013<br>
@@ -7430,6 +7430,8 @@ private:<br>
   /// The parser maintains this state here.<br>
   Scope *CurScope;<br>
<br>
+  mutable IdentifierInfo *Ident_super;<br>
+<br>
 protected:<br>
   friend class Parser;<br>
   friend class InitializationSequence;<br>
@@ -7447,6 +7449,8 @@ public:<br>
   /// template substitution or instantiation.<br>
   Scope *getCurScope() const { return CurScope; }<br>
<br>
+  IdentifierInfo *getSuperIdentifier() const;<br>
+<br>
   Decl *getObjCDeclContext() const;<br>
<br>
   DeclContext *getCurLexicalContext() const {<br>
<br>
Modified: cfe/trunk/lib/Sema/Sema.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=177126&r1=177125&r2=177126&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=177126&r1=177125&r2=177126&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/Sema.cpp (original)<br>
+++ cfe/trunk/lib/Sema/Sema.cpp Thu Mar 14 17:56:43 2013<br>
@@ -90,7 +90,7 @@ Sema::Sema(Preprocessor &pp, ASTContext<br>
     AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),<br>
     NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),<br>
     CurrentInstantiationScope(0), TyposCorrected(0),<br>
-    AnalysisWarnings(*this)<br>
+    AnalysisWarnings(*this), Ident_super(0)<br>
 {<br>
   TUScope = 0;<br>
<br>
@@ -1302,3 +1302,9 @@ bool Sema::tryToRecoverWithCall(ExprResu<br>
   E = ExprError();<br>
   return true;<br>
 }<br>
+<br>
+IdentifierInfo *Sema::getSuperIdentifier() const {<br>
+  if (!Ident_super)<br>
+    Ident_super = &Context.Idents.get("super");<br>
+  return Ident_super;<br>
+}<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=177126&r1=177125&r2=177126&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=177126&r1=177125&r2=177126&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Thu Mar 14 17:56:43 2013<br>
@@ -5315,7 +5315,7 @@ void Sema::CodeCompleteObjCSuperMessage(<br>
   } else {<br>
     // "super" may be the name of a type or variable. Figure out which<br>
     // it is.<br>
-    IdentifierInfo *Super = &Context.Idents.get("super");<br>
+    IdentifierInfo *Super = getSuperIdentifier();<br>
     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,<br>
                                      LookupOrdinaryName);<br>
     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaLookup.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=177126&r1=177125&r2=177126&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=177126&r1=177125&r2=177126&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Thu Mar 14 17:56:43 2013<br>
@@ -3734,6 +3734,16 @@ TypoCorrection Sema::CorrectTypo(const D<br>
   if (!ActiveTemplateInstantiations.empty())<br>
     return TypoCorrection();<br>
<br>
+  // Don't try to correct 'super'.<br>
+  if (S && S->isInObjcMethodScope() && Typo == getSuperIdentifier())<br>
+    return TypoCorrection();<br>
+<br>
+  // This is for regression testing. It's disabled by default.<br>
+  if (Diags.getDiagnosticLevel(diag::warn_spellcheck_initiated,<br>
+                               TypoName.getLoc()) != DiagnosticsEngine::Ignored)<br>
+    Diag(TypoName.getLoc(), diag::warn_spellcheck_initiated)<br>
+      << TypoName.getName();<br>
+<br>
   NamespaceSpecifierSet Namespaces(Context, CurContext, SS);<br>
<br>
   TypoCorrectionConsumer Consumer(*this, Typo);<br>
<br>
Added: cfe/trunk/test/SemaObjC/typo-correction.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/typo-correction.m?rev=177126&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/typo-correction.m?rev=177126&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaObjC/typo-correction.m (added)<br>
+++ cfe/trunk/test/SemaObjC/typo-correction.m Thu Mar 14 17:56:43 2013<br>
@@ -0,0 +1,21 @@<br>
+// RUN: %clang_cc1 %s -verify -fsyntax-only -Wspellcheck<br>
+<br>
+@interface B<br>
+@property int x;<br>
+@end<br>
+<br>
+@interface S : B<br>
+@end<br>
+<br>
+// Spell-checking 'undefined' is ok.<br>
+undefined var; // expected-warning {{spell-checking initiated}} \<br>
+               // expected-error {{unknown type name}}<br>
+<br>
+typedef int super1;<br>
+@implementation S<br>
+-(void)foo {<br>
+  // Spell-checking 'super' is not ok.<br>
+  super.x = 0;<br>
+  self.x = 0;<br>
+}<br>
+@end<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br>