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:
Fariborz Jahanian 2008-12-05 01:35:25 +00:00
parent 8e942123cb
commit 521b3a363e
3 changed files with 31 additions and 13 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -16,6 +16,6 @@
@implementation MyClass
- (void)myMethod { }
- (void)myMethod2 { }
- (vid)myMethod2 { } // expected-error {{expected a type}}
@end