| // RUN: %clang_cc1 -fsyntax-only %s -verify -fblocks |
| // FIXME: should compile |
| // Test for blocks with explicit return type specified. |
| |
| typedef float * PF; |
| float gf; |
| |
| @interface NSView |
| - (id) some_method_that_returns_id; |
| @end |
| |
| NSView *some_object; |
| |
| void some_func (NSView * (^) (id)); |
| |
| typedef struct dispatch_item_s *dispatch_item_t; |
| typedef void (^completion_block_t)(void); |
| |
| typedef double (^myblock)(int); |
| double test(myblock I); |
| |
| int main() { |
| __block int x = 1; |
| __block int y = 2; |
| |
| (void)^void *{ return 0; }; |
| |
| (void)^float(float y){ return y; }; |
| |
| (void)^double (float y, double d) { |
| if (y) |
| return d; |
| else |
| return y; |
| }; |
| |
| const char * (^chb) (int flag, const char *arg, char *arg1) = ^ const char * (int flag, const char *arg, char *arg1) { |
| if (flag) |
| return 0; |
| if (flag == 1) |
| return arg; |
| else if (flag == 2) |
| return ""; |
| return arg1; |
| }; |
| |
| (void)^PF { return &gf; }; |
| |
| some_func(^ NSView * (id whatever) { return [some_object some_method_that_returns_id]; }); |
| |
| double res = test(^(int z){x = y+z; return (double)z; }); |
| } |
| |
| void func() { |
| completion_block_t X; |
| |
| completion_block_t (^blockx)(dispatch_item_t) = ^completion_block_t (dispatch_item_t item) { |
| return X; |
| }; |
| |
| completion_block_t (^blocky)(dispatch_item_t) = ^(dispatch_item_t item) { |
| return X; |
| }; |
| |
| blockx = blocky; |
| } |
| |
| |
| // intent: block taking int returning block that takes char,int and returns int |
| int (^(^block)(double x))(char, short); |
| |
| void foo() { |
| int one = 1; |
| block = ^(double x){ return ^(char c, short y) { return one + c + y; };}; // expected-error {{returning block that lives on the local stack}} |
| // or: |
| block = ^(double x){ return ^(char c, short y) { return one + (int)c + y; };}; // expected-error {{returning block that lives on the local stack}} |
| } |