зеркало из https://github.com/microsoft/clang-1.git
When declaring an Objective-C implementation without a corresponding
interface, suggest correction of typos. For example, given: @interface NSString @end @implementation NSstring @end we'll warn with: t.m:4:19: warning: cannot find interface declaration for 'NSstring'; did you mean 'NSString'? @implementation NSstring ^ However, since this is just a warning, we don't provide a fix-it hint. Good idea, Ted! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92488 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
3f27b38480
Коммит
95ff742380
|
@ -2575,6 +2575,8 @@ def err_property_not_found_suggest : Error<
|
|||
"property %0 not found on object of type %1; did you mean %2?">;
|
||||
def err_undef_interface_suggest : Error<
|
||||
"cannot find interface declaration for %0; did you mean %1?">;
|
||||
def warn_undef_interface_suggest : Warning<
|
||||
"cannot find interface declaration for %0; did you mean %1?">;
|
||||
def err_undef_superclass_suggest : Error<
|
||||
"cannot find interface declaration for %0, superclass of %1; did you mean "
|
||||
"%2?">;
|
||||
|
|
|
@ -689,13 +689,27 @@ Sema::DeclPtrTy Sema::ActOnStartClassImplementation(
|
|||
if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
|
||||
Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
|
||||
Diag(PrevDecl->getLocation(), diag::note_previous_definition);
|
||||
} else {
|
||||
// Is there an interface declaration of this class; if not, warn!
|
||||
IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
|
||||
if (!IDecl || IDecl->isForwardDecl()) {
|
||||
} else if ((IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl))) {
|
||||
// If this is a forward declaration of an interface, warn.
|
||||
if (IDecl->isForwardDecl()) {
|
||||
Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
|
||||
IDecl = 0;
|
||||
}
|
||||
} else {
|
||||
// We did not find anything with the name ClassName; try to correct for
|
||||
// typos in the class name.
|
||||
LookupResult R(*this, ClassName, ClassLoc, LookupOrdinaryName);
|
||||
if (CorrectTypo(R, TUScope, 0) &&
|
||||
(IDecl = R.getAsSingle<ObjCInterfaceDecl>())) {
|
||||
// Suggest the (potentially) correct interface name. However, don't
|
||||
// provide a code-modification hint or use the typo name for recovery,
|
||||
// because this is just a warning. The program may actually be correct.
|
||||
Diag(ClassLoc, diag::warn_undef_interface_suggest)
|
||||
<< ClassName << R.getLookupName();
|
||||
IDecl = 0;
|
||||
} else {
|
||||
Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
|
||||
}
|
||||
}
|
||||
|
||||
// Check that super class name is valid class name
|
||||
|
|
|
@ -31,3 +31,5 @@
|
|||
@implementation RecursiveClass
|
||||
@end
|
||||
|
||||
@implementation iNTF3 // expected-warning{{cannot find interface declaration for 'iNTF3'; did you mean 'INTF3'?}}
|
||||
@end
|
||||
|
|
Загрузка…
Ссылка в новой задаче