diff options
Diffstat (limited to 'test/SemaObjC/block-type-safety.m')
-rw-r--r-- | test/SemaObjC/block-type-safety.m | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/test/SemaObjC/block-type-safety.m b/test/SemaObjC/block-type-safety.m index b40f9b0..402a658 100644 --- a/test/SemaObjC/block-type-safety.m +++ b/test/SemaObjC/block-type-safety.m @@ -4,7 +4,7 @@ @interface Super @end @interface Sub : Super @end -void f2(void(^f)(Super *)) { +void f2(void(^f)(Super *)) { // expected-note{{passing argument to parameter 'f' here}} Super *o; f(o); } @@ -18,7 +18,7 @@ void r0(Super* (^f)()) { Super *o = f(); } -void r1(Sub* (^f)()) { +void r1(Sub* (^f)()) { // expected-note{{passing argument to parameter 'f' here}} Sub *o = f(); } @@ -29,14 +29,14 @@ void r2 (id<NSObject> (^f) (void)) { } void test1() { - f2(^(Sub *o) { }); // expected-error {{incompatible block pointer types passing 'void (^)(Sub *)', expected 'void (^)(Super *)'}} + f2(^(Sub *o) { }); // expected-error {{incompatible block pointer types passing}} f3(^(Super *o) { }); // OK, block taking Super* may be called with a Sub* r0(^Super* () { return 0; }); // OK r0(^Sub* () { return 0; }); // OK, variable of type Super* gets return value of type Sub* r0(^id () { return 0; }); - r1(^Super* () { return 0; }); // expected-error {{incompatible block pointer types passing 'Super *(^)(void)', expected 'Sub *(^)()'}} + r1(^Super* () { return 0; }); // expected-error {{incompatible block pointer types passing}} r1(^Sub* () { return 0; }); // OK r1(^id () { return 0; }); @@ -94,3 +94,13 @@ void test2(void) } @end +@protocol P, P2; +void f4(void (^f)(id<P> x)) { // expected-note{{passing argument to parameter 'f' here}} + NSArray<P2> *b; + f(b); // expected-warning {{passing 'NSArray<P2> *' to parameter of incompatible type 'id<P>'}} +} + +void test3() { + f4(^(NSArray<P2>* a) { }); // expected-error {{incompatible block pointer types passing 'void (^)(NSArray<P2> *)' to parameter of type 'void (^)(id<P>)'}} +} + |