Lookup selector in protocol list of qualified objc type

to avoid a bogus warning. // rdar:// 9072298

llvm-svn: 127355
This commit is contained in:
Fariborz Jahanian 2011-03-09 20:18:06 +00:00
parent 9363d41f14
commit 3dc11ad796
4 changed files with 52 additions and 1 deletions

View File

@ -4551,6 +4551,9 @@ public:
ObjCInterfaceDecl *CDecl);
ObjCMethodDecl *LookupPrivateInstanceMethod(Selector Sel,
ObjCInterfaceDecl *ClassDecl);
ObjCMethodDecl *LookupMethodInQualifiedType(Selector Sel,
const ObjCObjectPointerType *OPT,
bool IsInstance);
ExprResult
HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,

View File

@ -381,6 +381,23 @@ ObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel,
return Method;
}
/// LookupMethodInQualifiedType - Lookups up a method in protocol qualifier
/// list of a qualified objective pointer type.
ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel,
const ObjCObjectPointerType *OPT,
bool Instance)
{
ObjCMethodDecl *MD = 0;
for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
E = OPT->qual_end(); I != E; ++I) {
ObjCProtocolDecl *PROTO = (*I);
if ((MD = PROTO->lookupMethod(Sel, Instance))) {
return MD;
}
}
return 0;
}
/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an
/// objective C interface. This is a property reference expression.
ExprResult Sema::

View File

@ -991,7 +991,8 @@ Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
Selector CSelector = Context.Selectors.getSelector(3, &KeyIdents[0]);
if (ObjCInterfaceDecl *IDecl = OPT->getInterfaceDecl()) {
if (!IDecl->isForwardDecl() &&
!IDecl->lookupInstanceMethod(CSelector)) {
!IDecl->lookupInstanceMethod(CSelector) &&
!LookupMethodInQualifiedType(CSelector, OPT, true)) {
// Must further look into private implementation methods.
if (!LookupPrivateInstanceMethod(CSelector, IDecl))
Diag(ForLoc, diag::warn_collection_expr_type)

View File

@ -16,3 +16,33 @@ void f(NSArray *a) {
for (id thisKey in keys);
for (id thisKey in keys);
}
/* // rdar://9072298 */
@protocol NSObject @end
@interface NSObject <NSObject> {
Class isa;
}
@end
typedef struct {
unsigned long state;
id *itemsPtr;
unsigned long *mutationsPtr;
unsigned long extra[5];
} NSFastEnumerationState;
@protocol NSFastEnumeration
- (unsigned long)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(unsigned long)len;
@end
int main ()
{
NSObject<NSFastEnumeration>* collection = ((void*)0);
for (id thing in collection) { }
return 0;
}