Patch for diagnosing type mismatch between
methods in class and its implementation. This is work in progress. llvm-svn: 60573
This commit is contained in:
parent
8e942123cb
commit
521b3a363e
|
@ -643,6 +643,34 @@ void Sema::ImplMethodsVsClassMethods(ObjCImplementationDecl* IMPDecl,
|
|||
E = IDecl->instmeth_end(); I != E; ++I)
|
||||
if (!(*I)->isSynthesized() && !InsMap.count((*I)->getSelector()))
|
||||
WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl);
|
||||
else if (!(*I)->isSynthesized()){
|
||||
bool err = false;
|
||||
ObjCMethodDecl *ImpMethodDecl =
|
||||
IMPDecl->getInstanceMethod((*I)->getSelector());
|
||||
ObjCMethodDecl *IntfMethodDecl =
|
||||
IDecl->getInstanceMethod((*I)->getSelector());
|
||||
QualType ImpMethodQType =
|
||||
Context.getCanonicalType(ImpMethodDecl->getResultType());
|
||||
QualType IntfMethodQType =
|
||||
Context.getCanonicalType(IntfMethodDecl->getResultType());
|
||||
if (!Context.typesAreCompatible(IntfMethodQType, ImpMethodQType))
|
||||
err = true;
|
||||
else for (ObjCMethodDecl::param_iterator IM=ImpMethodDecl->param_begin(),
|
||||
IF=IntfMethodDecl->param_begin(),
|
||||
EM=ImpMethodDecl->param_end(); IM!=EM; ++IM, IF++) {
|
||||
ImpMethodQType = Context.getCanonicalType((*IM)->getType());
|
||||
IntfMethodQType = Context.getCanonicalType((*IF)->getType());
|
||||
if (!Context.typesAreCompatible(IntfMethodQType, ImpMethodQType)) {
|
||||
err = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (err) {
|
||||
Diag(ImpMethodDecl->getLocation(), diag::err_conflicting_types)
|
||||
<< ImpMethodDecl->getDeclName();
|
||||
Diag(IntfMethodDecl->getLocation(), diag::note_previous_definition);
|
||||
}
|
||||
}
|
||||
|
||||
llvm::DenseSet<Selector> ClsMap;
|
||||
// Check and see if class methods in class interface have been
|
||||
|
|
|
@ -15,25 +15,15 @@ NSInteger codeAssistantCaseCompareItems(id<PBXCompletionItem> a, id<PBXCompletio
|
|||
{
|
||||
}
|
||||
|
||||
#if 0
|
||||
FIXME: clang needs to compare each method prototype with its definition (see below).
|
||||
|
||||
GCC produces the following correct warnning:
|
||||
[snaroff:llvm/tools/clang] snarofflocal% cc -c test/Sema/objc-types-compatible.m
|
||||
test/Sema/objc-types-compatible.m: In function ‘-[TedWantsToVerifyObjCDoesTheRightThing compareThis:withThat:]’:
|
||||
test/Sema/objc-types-compatible.m:26: warning: conflicting types for ‘-(id)compareThis:(id <PBXCompletionItem>)a withThat:(id <PBXCompletionItem>)b’
|
||||
test/Sema/objc-types-compatible.m:20: warning: previous declaration of ‘-(id)compareThis:(int)a withThat:(id)b’
|
||||
#endif
|
||||
|
||||
@interface TedWantsToVerifyObjCDoesTheRightThing
|
||||
|
||||
- compareThis:(int)a withThat:(id)b;
|
||||
- compareThis:(int)a withThat:(id)b; // expected-note {{previous definition is here}}
|
||||
|
||||
@end
|
||||
|
||||
@implementation TedWantsToVerifyObjCDoesTheRightThing
|
||||
|
||||
- compareThis:(id<PBXCompletionItem>)a withThat:(id<PBXCompletionItem>)b {
|
||||
- compareThis:(id<PBXCompletionItem>)a withThat:(id<PBXCompletionItem>)b { // expected-error {{conflicting types for 'compareThis:withThat:'}}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,6 @@
|
|||
|
||||
@implementation MyClass
|
||||
- (void)myMethod { }
|
||||
- (void)myMethod2 { }
|
||||
- (vid)myMethod2 { } // expected-error {{expected a type}}
|
||||
@end
|
||||
|
||||
|
|
Loading…
Reference in New Issue