Objective-C. When multiple nullary selectors are found in

global pool in the course of method selection for
a messaging expression, select one with the most general
return type of 'id'. This is to remove type-mismatch 
warning (which is useless) as result of random selection of 
method with more restrictive return type. rdar://18095772

llvm-svn: 216560
This commit is contained in:
Fariborz Jahanian 2014-08-27 16:38:47 +00:00
parent 1d6082ff17
commit 180d76b408
2 changed files with 32 additions and 1 deletions

View File

@ -5743,10 +5743,20 @@ ObjCMethodDecl *Sema::SelectBestMethod(Selector Sel, MultiExprArg Args,
break;
}
}
} else
} else {
// Check for extra arguments to non-variadic methods.
if (Args.size() != NumNamedArgs)
Match = false;
else if (Match && NumNamedArgs == 0 && Methods.size() > 1) {
// Special case when selectors have no argument. In this case, select
// one with the most general result type of 'id'.
for (unsigned b = 0, e = Methods.size(); b < e; b++) {
QualType ReturnT = Methods[b]->getReturnType();
if (ReturnT->isObjCIdType())
return Methods[b];
}
}
}
if (Match)
return Method;

View File

@ -40,3 +40,24 @@
void func( Class c, float g ) {
[c clsMethod: &g];
}
// rdar://18095772
@protocol NSKeyedArchiverDelegate @end
@interface NSKeyedArchiver
@property (assign) id <NSKeyedArchiverDelegate> delegate;
@end
@interface NSConnection
@property (assign) id delegate;
@end
extern id NSApp;
@interface AppDelegate
@end
AppDelegate* GetDelegate()
{
return [NSApp delegate];
}