Patch to allow C-style cast from 'void *' to block pointer type.

(fixes radar 7465023).

llvm-svn: 91171
This commit is contained in:
Fariborz Jahanian 2009-12-11 22:40:48 +00:00
parent f72bdf7eed
commit ffe912c647
5 changed files with 18 additions and 1 deletions

View File

@ -1575,7 +1575,10 @@ public:
/// CK_AnyPointerToObjCPointerCast - Casting any pointer to objective-c
/// pointer
CK_AnyPointerToObjCPointerCast
CK_AnyPointerToObjCPointerCast,
/// CK_AnyPointerToBlockPointerCast - Casting any pointer to block
/// pointer
CK_AnyPointerToBlockPointerCast
};

View File

@ -560,6 +560,8 @@ const char *CastExpr::getCastKindName() const {
return "MemberPointerToBoolean";
case CastExpr::CK_AnyPointerToObjCPointerCast:
return "AnyPointerToObjCPointerCast";
case CastExpr::CK_AnyPointerToBlockPointerCast:
return "AnyPointerToBlockPointerCast";
}
assert(0 && "Unhandled cast kind!");

View File

@ -809,6 +809,7 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
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));

View File

@ -545,6 +545,11 @@ static TryCastResult TryStaticCast(Sema &Self, Expr *&SrcExpr,
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;
}
}
}

View File

@ -44,3 +44,9 @@ namespace N {
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;
}