]> granicus.if.org Git - clang/commitdiff
Put type restriction on convesion to nonconforming 'id' back in
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Apr 2010 17:23:39 +0000 (17:23 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Apr 2010 17:23:39 +0000 (17:23 +0000)
block pointer type comparison.

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

lib/AST/ASTContext.cpp
test/SemaObjC/block-type-safety.m

index c77acce1bd067179489e69c77719cd90c8f1919e..f265f8e8a70c7d282c08e20b95312a2d99b42a8e 100644 (file)
@@ -4136,15 +4136,14 @@ bool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
 bool ASTContext::canAssignObjCInterfacesInBlockPointer(
                                          const ObjCObjectPointerType *LHSOPT,
                                          const ObjCObjectPointerType *RHSOPT) {
-  if (RHSOPT->isObjCBuiltinType() || 
-      LHSOPT->isObjCIdType() || LHSOPT->isObjCQualifiedIdType())
+  if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
     return true;
   
   if (LHSOPT->isObjCBuiltinType()) {
     return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType();
   }
   
-  if (RHSOPT->isObjCQualifiedIdType())
+  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
     return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
                                              QualType(RHSOPT,0),
                                              false);
index b40f9b09358555210baa4d7b722514aa0127bdcf..0df8c675ed9cd5e40ad8c3dc8b22622c2ad1a036 100644 (file)
@@ -94,3 +94,13 @@ void test2(void)
    }
 @end
 
+@protocol P, P2;
+void f4(void (^f)(id<P> x)) {
+    NSArray<P2> *b;
+    f(b);      // expected-warning {{incompatible type passing 'NSArray<P2> *', expected 'id<P>'}}
+}
+
+void test3() {
+  f4(^(NSArray<P2>* a) { });  // expected-error {{incompatible block pointer types passing 'void (^)(NSArray<P2> *)', expected 'void (^)(id<P>)'}}
+}
+