зеркало из https://github.com/microsoft/clang-1.git
Don't try to typo-correct 'super' in an objc method.
This created 2 issues: 1) Performance issue, since typo-correction with PCH/modules is rather expensive. 2) Correctness issue, since if it managed to "correct" 'super' then bogus compiler errors would be emitted, like this: 3.m:8:3: error: unknown type name 'super'; did you mean 'super1'? super.x = 0; ^~~~~ super1 t3.m:5:13: note: 'super1' declared here typedef int super1; ^ t3.m:8:8: error: expected identifier or '(' super.x = 0; ^ git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177126 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
503836ae83
Коммит
57f8da506a
|
@ -6074,6 +6074,8 @@ def warn_direct_ivar_access : Warning<"instance variable %0 is being "
|
|||
"directly accessed">, InGroup<DiagGroup<"direct-ivar-access">>, DefaultIgnore;
|
||||
|
||||
// Spell-checking diagnostics
|
||||
def warn_spellcheck_initiated : Warning<"spell-checking initiated for %0">,
|
||||
InGroup<DiagGroup<"spellcheck">>, DefaultIgnore;
|
||||
def err_unknown_type_or_class_name_suggest : Error<
|
||||
"unknown %select{type|class}2 name %0; did you mean %1?">;
|
||||
def err_unknown_typename_suggest : Error<
|
||||
|
|
|
@ -7430,6 +7430,8 @@ private:
|
|||
/// The parser maintains this state here.
|
||||
Scope *CurScope;
|
||||
|
||||
mutable IdentifierInfo *Ident_super;
|
||||
|
||||
protected:
|
||||
friend class Parser;
|
||||
friend class InitializationSequence;
|
||||
|
@ -7447,6 +7449,8 @@ public:
|
|||
/// template substitution or instantiation.
|
||||
Scope *getCurScope() const { return CurScope; }
|
||||
|
||||
IdentifierInfo *getSuperIdentifier() const;
|
||||
|
||||
Decl *getObjCDeclContext() const;
|
||||
|
||||
DeclContext *getCurLexicalContext() const {
|
||||
|
|
|
@ -90,7 +90,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
|
|||
AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
|
||||
NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
|
||||
CurrentInstantiationScope(0), TyposCorrected(0),
|
||||
AnalysisWarnings(*this)
|
||||
AnalysisWarnings(*this), Ident_super(0)
|
||||
{
|
||||
TUScope = 0;
|
||||
|
||||
|
@ -1302,3 +1302,9 @@ bool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,
|
|||
E = ExprError();
|
||||
return true;
|
||||
}
|
||||
|
||||
IdentifierInfo *Sema::getSuperIdentifier() const {
|
||||
if (!Ident_super)
|
||||
Ident_super = &Context.Idents.get("super");
|
||||
return Ident_super;
|
||||
}
|
||||
|
|
|
@ -5315,7 +5315,7 @@ void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
|
|||
} else {
|
||||
// "super" may be the name of a type or variable. Figure out which
|
||||
// it is.
|
||||
IdentifierInfo *Super = &Context.Idents.get("super");
|
||||
IdentifierInfo *Super = getSuperIdentifier();
|
||||
NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
|
||||
LookupOrdinaryName);
|
||||
if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
|
||||
|
|
|
@ -3734,6 +3734,16 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
|
|||
if (!ActiveTemplateInstantiations.empty())
|
||||
return TypoCorrection();
|
||||
|
||||
// Don't try to correct 'super'.
|
||||
if (S && S->isInObjcMethodScope() && Typo == getSuperIdentifier())
|
||||
return TypoCorrection();
|
||||
|
||||
// This is for regression testing. It's disabled by default.
|
||||
if (Diags.getDiagnosticLevel(diag::warn_spellcheck_initiated,
|
||||
TypoName.getLoc()) != DiagnosticsEngine::Ignored)
|
||||
Diag(TypoName.getLoc(), diag::warn_spellcheck_initiated)
|
||||
<< TypoName.getName();
|
||||
|
||||
NamespaceSpecifierSet Namespaces(Context, CurContext, SS);
|
||||
|
||||
TypoCorrectionConsumer Consumer(*this, Typo);
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// RUN: %clang_cc1 %s -verify -fsyntax-only -Wspellcheck
|
||||
|
||||
@interface B
|
||||
@property int x;
|
||||
@end
|
||||
|
||||
@interface S : B
|
||||
@end
|
||||
|
||||
// Spell-checking 'undefined' is ok.
|
||||
undefined var; // expected-warning {{spell-checking initiated}} \
|
||||
// expected-error {{unknown type name}}
|
||||
|
||||
typedef int super1;
|
||||
@implementation S
|
||||
-(void)foo {
|
||||
// Spell-checking 'super' is not ok.
|
||||
super.x = 0;
|
||||
self.x = 0;
|
||||
}
|
||||
@end
|
Загрузка…
Ссылка в новой задаче