[cfe-commits] r61359 - in /cfe/trunk: lib/Sema/SemaOverload.cpp test/SemaObjC/blocks.m test/SemaObjCXX/blocks.mm

Douglas Gregor dgregor at apple.com
Mon Dec 22 16:54:00 PST 2008


Author: dgregor
Date: Mon Dec 22 18:53:59 2008
New Revision: 61359

URL: http://llvm.org/viewvc/llvm-project?rev=61359&view=rev
Log:
Add some block-pointer conversions in C++

Added:
    cfe/trunk/test/SemaObjCXX/blocks.mm
Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaObjC/blocks.m

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=61359&r1=61358&r2=61359&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Dec 22 18:53:59 2008
@@ -135,7 +135,7 @@
   // check for their presence as well as checking whether FromType is
   // a pointer.
   if (ToType->isBooleanType() &&
-      (FromType->isPointerType() ||
+      (FromType->isPointerType() || FromType->isBlockPointerType() ||
        First == ICK_Array_To_Pointer || First == ICK_Function_To_Pointer))
     return true;
 
@@ -547,7 +547,8 @@
   else if (ToType->isBooleanType() &&
            (FromType->isArithmeticType() ||
             FromType->isEnumeralType() ||
-            FromType->isPointerType())) {
+            FromType->isPointerType() ||
+            FromType->isBlockPointerType())) {
     SCS.Second = ICK_Boolean_Conversion;
     FromType = Context.BoolTy;
   } else {
@@ -857,25 +858,33 @@
     return true;
   }
 
+  // Beyond this point, both types need to be pointers or block pointers.
+  QualType ToPointeeType;
   const PointerType* ToTypePtr = ToType->getAsPointerType();
-  if (!ToTypePtr)
+  if (ToTypePtr)
+    ToPointeeType = ToTypePtr->getPointeeType();
+  else if (const BlockPointerType *ToBlockPtr = ToType->getAsBlockPointerType())
+    ToPointeeType = ToBlockPtr->getPointeeType();
+  else
     return false;
 
-  // Beyond this point, both types need to be pointers.
+  QualType FromPointeeType;
   const PointerType *FromTypePtr = FromType->getAsPointerType();
-  if (!FromTypePtr)
+  if (FromTypePtr)
+    FromPointeeType = FromTypePtr->getPointeeType();
+  else if (const BlockPointerType *FromBlockPtr 
+             = FromType->getAsBlockPointerType())
+    FromPointeeType = FromBlockPtr->getPointeeType();
+  else
     return false;
 
-  QualType FromPointeeType = FromTypePtr->getPointeeType();
-  QualType ToPointeeType = ToTypePtr->getPointeeType();
-
   // Objective C++: We're able to convert from a pointer to an
   // interface to a pointer to a different interface.
   const ObjCInterfaceType* FromIface = FromPointeeType->getAsObjCInterfaceType();
   const ObjCInterfaceType* ToIface = ToPointeeType->getAsObjCInterfaceType();
   if (FromIface && ToIface && 
       Context.canAssignObjCInterfaces(ToIface, FromIface)) {
-    ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, 
+    ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
                                                        ToPointeeType,
                                                        ToType, Context);
     return true;
@@ -887,7 +896,7 @@
     // interfaces, which is permitted. However, we're going to
     // complain about it.
     IncompatibleObjC = true;
-    ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, 
+    ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
                                                        ToPointeeType,
                                                        ToType, Context);
     return true;
@@ -924,7 +933,7 @@
     return true;
   }
 
-  // If we have pointers to functions, check whether the only
+  // If we have pointers to functions or blocks, check whether the only
   // differences in the argument and result types are in Objective-C
   // pointer conversions. If so, we permit the conversion (but
   // complain about it).

Modified: cfe/trunk/test/SemaObjC/blocks.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/blocks.m?rev=61359&r1=61358&r2=61359&view=diff

==============================================================================
--- cfe/trunk/test/SemaObjC/blocks.m (original)
+++ cfe/trunk/test/SemaObjC/blocks.m Mon Dec 22 18:53:59 2008
@@ -20,3 +20,7 @@
 void foo4(id (^objectCreationBlock)(int)) {
     return bar4(objectCreationBlock); // expected-warning{{incompatible block pointer types passing 'id (^)(int)', expected 'id (^)()'}}
 }
+
+void foo5(id (^x)(int)) {
+  if (x) { }
+}

Added: cfe/trunk/test/SemaObjCXX/blocks.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/blocks.mm?rev=61359&view=auto

==============================================================================
--- cfe/trunk/test/SemaObjCXX/blocks.mm (added)
+++ cfe/trunk/test/SemaObjCXX/blocks.mm Mon Dec 22 18:53:59 2008
@@ -0,0 +1,26 @@
+// RUN: clang -fsyntax-only -verify -fblocks %s
+ at protocol NSObject;
+
+void bar(id(^)(void));
+void foo(id <NSObject>(^objectCreationBlock)(void)) {
+    return bar(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (^)(void)', expected 'id<NSObject> (^)(void)'}}
+}
+
+void bar2(id(*)(void));
+void foo2(id <NSObject>(*objectCreationBlock)(void)) {
+    return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (*)(void)', expected 'id<NSObject> (*)(void)'}}
+}
+
+void bar3(id(*)());
+void foo3(id (*objectCreationBlock)(int)) {
+    return bar3(objectCreationBlock); // expected-error{{incompatible type passing 'id (*)(int)', expected 'id (*)(void)'}}
+}
+
+void bar4(id(^)());
+void foo4(id (^objectCreationBlock)(int)) {
+    return bar4(objectCreationBlock); // expected-error{{incompatible type passing 'id (^)(int)', expected 'id (^)(void)'}}
+}
+
+void foo5(id (^x)(int)) {
+  if (x) { }
+}





More information about the cfe-commits mailing list