aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-01-21 00:05:09 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-01-21 00:05:09 +0000
commitf7c43fdd28d4963a16291cb6b000ed955f044262 (patch)
tree7b5d354e28a1e329e5f2588e5f8e3ec9e527f966
parentb2cd48756119f4d8d2a865b4b3e0e8efd02e26a0 (diff)
Also allow cast of block pointer type to
pointer to an any object. Another variation of radar 7562285. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94052 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaOverload.cpp7
-rw-r--r--test/SemaObjCXX/cstyle-block-pointer-cast.mm19
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index e9b6072adc..7b0c98c569 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -1151,6 +1151,13 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType,
}
ToPointeeType = ToBlockPtr->getPointeeType();
}
+ else if (FromType->getAs<BlockPointerType>() &&
+ ToObjCPtr && ToObjCPtr->isObjCBuiltinType()) {
+ // Objective C++: We're able to convert from a block pointer type to a
+ // pointer to an any object.
+ ConvertedType = ToType;
+ return true;
+ }
else
return false;
diff --git a/test/SemaObjCXX/cstyle-block-pointer-cast.mm b/test/SemaObjCXX/cstyle-block-pointer-cast.mm
index 2796512ac0..72f5283dea 100644
--- a/test/SemaObjCXX/cstyle-block-pointer-cast.mm
+++ b/test/SemaObjCXX/cstyle-block-pointer-cast.mm
@@ -21,3 +21,22 @@ typedef int (^blocktype)(int a, int b);
return (blocktype)c;
}
@end
+
+@interface B {
+ blocktype a;
+ blocktype b;
+ blocktype c;
+}
+- (id)Meth;
+@end
+
+@implementation B
+- (id)Meth {
+ if (a)
+ return (A*)a; // expected-error {{C-style cast from 'blocktype' (aka 'int (^)(int, int)') to 'A *' is not allowed}}
+ if (b)
+ return (id)b;
+ if (c)
+ return (Class)b;
+}
+@end