/// CK_AnyPointerToObjCPointerCast - Casting any pointer to objective-c
/// pointer
- CK_AnyPointerToObjCPointerCast
+ CK_AnyPointerToObjCPointerCast,
+ /// CK_AnyPointerToBlockPointerCast - Casting any pointer to block
+ /// pointer
+ CK_AnyPointerToBlockPointerCast
};
return "MemberPointerToBoolean";
case CastExpr::CK_AnyPointerToObjCPointerCast:
return "AnyPointerToObjCPointerCast";
+ case CastExpr::CK_AnyPointerToBlockPointerCast:
+ return "AnyPointerToBlockPointerCast";
}
assert(0 && "Unhandled cast kind!");
break;
case CastExpr::CK_AnyPointerToObjCPointerCast:
+ case CastExpr::CK_AnyPointerToBlockPointerCast:
case CastExpr::CK_BitCast: {
Value *Src = Visit(const_cast<Expr*>(E));
return Builder.CreateBitCast(Src, ConvertType(DestTy));
Kind = CastExpr::CK_AnyPointerToObjCPointerCast;
return TC_Success;
}
+ else if (CStyle && DestType->isBlockPointerType()) {
+ // allow c-style cast of void * to block pointers.
+ Kind = CastExpr::CK_AnyPointerToBlockPointerCast;
+ return TC_Success;
+ }
}
}
foo(N::X()); // okay
}
@end
+
+typedef signed char BOOL;
+void foo6(void *block) {
+ void (^vb)(id obj, int idx, BOOL *stop) = (void (^)(id, int, BOOL *))block;
+ BOOL (^bb)(id obj, int idx, BOOL *stop) = (BOOL (^)(id, int, BOOL *))block;
+}