]> granicus.if.org Git - clang/commitdiff
Fix a regression where the initializer implements
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 12 Apr 2011 16:34:14 +0000 (16:34 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 12 Apr 2011 16:34:14 +0000 (16:34 +0000)
the initialized's protocol and yet clang warns.
objective-c issue, // rdar://9267196

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129363 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclObjC.h
lib/AST/ASTContext.cpp
test/SemaObjC/unqualified-to-qualified-class-warn.m

index 241d76c4487246635da0641fe0efae89ef1d9a51..84e7a63b029905f17e870da5aa6eea5bd1708bda 100644 (file)
@@ -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) {
index 420fcd398d2d1ab9ac54b1b9cef63821c2ecf832..7317928d971ee7265884631500cb6061ec6af7c6 100644 (file)
@@ -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;
index 5bbbfd9fcc25ecb5cbe6a61c92196485b46cad75..e6fa13850fbd1ea5e091e6bbe281d1600818695f 100644 (file)
@@ -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