forked from OSchip/llvm-project
Fix a regression where the initializer implements
the initialized's protocol and yet clang warns. objective-c issue, // rdar://9267196 llvm-svn: 129363
This commit is contained in:
parent
1ec0f46169
commit
240400b746
|
@ -629,27 +629,6 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
/// getImmSubClassOf - Returns Immediate sub-class of the specified interface class
|
||||
/// if 'Super' is a superclass of this class. null if no such super class.
|
||||
/// So in this example if 'this' is 'BClass' and 'Super' is 'AClass' then 'BClass'
|
||||
/// is returned.
|
||||
/// \code
|
||||
/// @interface BClass : AClass <SubFooable>
|
||||
/// @end
|
||||
/// \endcode
|
||||
|
||||
ObjCInterfaceDecl *getImmSubClassOf(const ObjCInterfaceDecl *Super) {
|
||||
ObjCInterfaceDecl *ImmSubClass = this;
|
||||
ObjCInterfaceDecl *I = this->getSuperClass();
|
||||
while (I != NULL) {
|
||||
if (Super == I)
|
||||
return ImmSubClass;
|
||||
ImmSubClass = I;
|
||||
I = I->getSuperClass();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName,
|
||||
ObjCInterfaceDecl *&ClassDeclared);
|
||||
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName) {
|
||||
|
|
|
@ -4987,15 +4987,15 @@ bool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
|
|||
// OK, if LHS is a superclass of RHS *and*
|
||||
// this superclass is assignment compatible with LHS.
|
||||
// false otherwise.
|
||||
ObjCInterfaceDecl *SuperClass =
|
||||
RHS->getInterface()->getImmSubClassOf(LHS->getInterface());
|
||||
if (SuperClass) {
|
||||
bool IsSuperClass =
|
||||
LHS->getInterface()->isSuperClassOf(RHS->getInterface());
|
||||
if (IsSuperClass) {
|
||||
// OK if conversion of LHS to SuperClass results in narrowing of types
|
||||
// ; i.e., SuperClass may implement at least one of the protocols
|
||||
// in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
|
||||
// But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
|
||||
llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
|
||||
CollectInheritedProtocols(SuperClass, SuperClassInheritedProtocols);
|
||||
CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
|
||||
// If super class has no protocols, it is not a match.
|
||||
if (SuperClassInheritedProtocols.empty())
|
||||
return false;
|
||||
|
|
|
@ -29,3 +29,44 @@ int main () {
|
|||
functionTakingAClassConformingToAProtocol(bobject); // Shouldn't warn - does implement Fooable
|
||||
return 0;
|
||||
}
|
||||
|
||||
// rdar://9267196
|
||||
@interface NSObject @end
|
||||
|
||||
@protocol MyProtocol
|
||||
@end
|
||||
|
||||
@interface MyClass : NSObject
|
||||
{
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation MyClass
|
||||
@end
|
||||
|
||||
@interface MySubclass : MyClass <MyProtocol>
|
||||
{
|
||||
}
|
||||
@end
|
||||
|
||||
@interface MyTestClass : NSObject
|
||||
{
|
||||
@private
|
||||
NSObject <MyProtocol> *someObj;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) NSObject <MyProtocol> *someObj;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MyTestClass
|
||||
|
||||
@synthesize someObj;
|
||||
|
||||
- (void)someMethod
|
||||
{
|
||||
MySubclass *foo;
|
||||
[self setSomeObj:foo]; // no warning here!
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue