diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-20 22:54:38 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-20 22:54:38 +0000 |
| commit | 4efdec067731bf2d28c9cf09b7ae050ef5e41176 (patch) | |
| tree | b8df5ada73b771c0fc211c0e671d2320d56e9e5a | |
| parent | c8e390c215c8afbf52a74a223b98245339fe9243 (diff) | |
| download | bcm5719-llvm-4efdec067731bf2d28c9cf09b7ae050ef5e41176.tar.gz bcm5719-llvm-4efdec067731bf2d28c9cf09b7ae050ef5e41176.zip | |
In objective-c++ land, a block pointer is another object pointer.
So, casting a generic object pointer ('id' or 'Class') to the
block pointer is allowed. Fixes radar 7562285.
llvm-svn: 94045
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 10 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/cstyle-block-pointer-cast.mm | 23 |
2 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 3b6cf89306b..e9b6072adca 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -1141,8 +1141,16 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType, QualType ToPointeeType; if (const PointerType *ToCPtr = ToType->getAs<PointerType>()) ToPointeeType = ToCPtr->getPointeeType(); - else if (const BlockPointerType *ToBlockPtr = ToType->getAs<BlockPointerType>()) + else if (const BlockPointerType *ToBlockPtr = + ToType->getAs<BlockPointerType>()) { + // Objective C++: We're able to convert from a pointer to an any object + // to a block pointer type. + if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) { + ConvertedType = ToType; + return true; + } ToPointeeType = ToBlockPtr->getPointeeType(); + } else return false; diff --git a/clang/test/SemaObjCXX/cstyle-block-pointer-cast.mm b/clang/test/SemaObjCXX/cstyle-block-pointer-cast.mm new file mode 100644 index 00000000000..2796512ac09 --- /dev/null +++ b/clang/test/SemaObjCXX/cstyle-block-pointer-cast.mm @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s +// radar 7562285 + +typedef int (^blocktype)(int a, int b); + +@interface A { + A* a; + id b; + Class c; +} +- (blocktype)Meth; +@end + +@implementation A +- (blocktype)Meth { + if (b) + return (blocktype)b; + else if (a) + return (blocktype)a; // expected-error {{C-style cast from 'A *' to 'blocktype' (aka 'int (^)(int, int)') is not allowed}} + else + return (blocktype)c; +} +@end |

