forked from OSchip/llvm-project
Lookup selector in protocol list of qualified objc type
to avoid a bogus warning. // rdar:// 9072298 llvm-svn: 127355
This commit is contained in:
parent
9363d41f14
commit
3dc11ad796
|
@ -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,
|
||||
|
|
|
@ -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::
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue