summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-03-27 21:10:05 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-03-27 21:10:05 +0000
commit2e8074bfc345fb1d0c614afc963b87c50ec9be89 (patch)
tree7d7c2466f6c1eed6b3a6397851326e8819dd8dd2 /clang
parent174376629a6b2a593137a13dc76b9867ff2575a6 (diff)
downloadbcm5719-llvm-2e8074bfc345fb1d0c614afc963b87c50ec9be89.tar.gz
bcm5719-llvm-2e8074bfc345fb1d0c614afc963b87c50ec9be89.zip
Further improvement to point to category
whose protocolls methods needs implementation. llvm-svn: 99730
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/Sema.h2
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp13
-rw-r--r--clang/test/SemaObjC/method-undef-category-warn-1.m6
3 files changed, 14 insertions, 7 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h
index 5436aa940d6..7187f529ce2 100644
--- a/clang/lib/Sema/Sema.h
+++ b/clang/lib/Sema/Sema.h
@@ -1452,7 +1452,7 @@ public:
bool& IncompleteImpl,
const llvm::DenseSet<Selector> &InsMap,
const llvm::DenseSet<Selector> &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/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
index 79a664f2e1f..cf7ffae2361 100644
--- a/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/clang/lib/Sema/SemaDeclObjC.cpp
@@ -769,7 +769,14 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
bool& IncompleteImpl,
const llvm::DenseSet<Selector> &InsMap,
const llvm::DenseSet<Selector> &ClsMap,
- ObjCInterfaceDecl *IDecl) {
+ ObjCContainerDecl *CDecl) {
+ ObjCInterfaceDecl *IDecl;
+ if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl))
+ IDecl = C->getClassInterface();
+ else
+ IDecl = dyn_cast<ObjCInterfaceDecl>(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/clang/test/SemaObjC/method-undef-category-warn-1.m b/clang/test/SemaObjC/method-undef-category-warn-1.m
index dace8ab2949..7f360499231 100644
--- a/clang/test/SemaObjC/method-undef-category-warn-1.m
+++ b/clang/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) <P>
+@interface MyClass1(CAT) <P> // 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) <P>
+@interface MyClass1(DOG) <P> // expected-note {{required for direct or indirect protocol 'P'}}
- (void)ppp; // expected-note {{method definition for 'ppp' not found}}
@end
OpenPOWER on IntegriCloud