From: Fariborz Jahanian Date: Sat, 27 Mar 2010 21:10:05 +0000 (+0000) Subject: Further improvement to point to category X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f28385991fa724ac0bd6017d709f17b1838cfea3;p=clang Further improvement to point to category whose protocolls methods needs implementation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99730 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 5436aa940d..7187f529ce 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1452,7 +1452,7 @@ public: bool& IncompleteImpl, const llvm::DenseSet &InsMap, const llvm::DenseSet &ClsMap, - ObjCInterfaceDecl *IDecl); + ObjCContainerDecl *CDecl); /// CheckImplementationIvars - This routine checks if the instance variables /// listed in the implelementation match those listed in the interface. diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 79a664f2e1..cf7ffae236 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -769,7 +769,14 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc, bool& IncompleteImpl, const llvm::DenseSet &InsMap, const llvm::DenseSet &ClsMap, - ObjCInterfaceDecl *IDecl) { + ObjCContainerDecl *CDecl) { + ObjCInterfaceDecl *IDecl; + if (ObjCCategoryDecl *C = dyn_cast(CDecl)) + IDecl = C->getClassInterface(); + else + IDecl = dyn_cast(CDecl); + assert (IDecl && "CheckProtocolMethodDefs - IDecl is null"); + ObjCInterfaceDecl *Super = IDecl->getSuperClass(); ObjCInterfaceDecl *NSIDecl = 0; if (getLangOptions().NeXTRuntime) { @@ -809,7 +816,7 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc, IDecl->lookupInstanceMethod(method->getSelector()); if (!MethodInClass || !MethodInClass->isSynthesized()) { WarnUndefinedMethod(ImpLoc, method, IncompleteImpl); - Diag(IDecl->getLocation(), diag::note_required_for_protocol_at) << + Diag(CDecl->getLocation(), diag::note_required_for_protocol_at) << PDecl->getDeclName(); } } @@ -955,7 +962,7 @@ void Sema::ImplMethodsVsClassMethods(ObjCImplDecl* IMPDecl, for (ObjCCategoryDecl::protocol_iterator PI = C->protocol_begin(), E = C->protocol_end(); PI != E; ++PI) CheckProtocolMethodDefs(IMPDecl->getLocation(), *PI, IncompleteImpl, - InsMap, ClsMap, C->getClassInterface()); + InsMap, ClsMap, CDecl); // Report unimplemented properties in the category as well. // When reporting on missing setter/getters, do not report when // setter/getter is implemented in category's primary class diff --git a/test/SemaObjC/method-undef-category-warn-1.m b/test/SemaObjC/method-undef-category-warn-1.m index dace8ab294..7f36049923 100644 --- a/test/SemaObjC/method-undef-category-warn-1.m +++ b/test/SemaObjC/method-undef-category-warn-1.m @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -@interface MyClass1 // expected-note 2 {{required for direct or indirect protocol 'P'}} +@interface MyClass1 @end @protocol P @@ -8,7 +8,7 @@ - (void) Pmeth1; // expected-note {{method definition for 'Pmeth1' not found}} @end -@interface MyClass1(CAT)

+@interface MyClass1(CAT)

// expected-note {{required for direct or indirect protocol 'P'}} - (void) meth2; // expected-note {{method definition for 'meth2' not found}} @end @@ -16,7 +16,7 @@ - (void) Pmeth1{} @end -@interface MyClass1(DOG)

+@interface MyClass1(DOG)

// expected-note {{required for direct or indirect protocol 'P'}} - (void)ppp; // expected-note {{method definition for 'ppp' not found}} @end