| /* APPLE LOCAL file radar 5732232 - blocks */ |
| /* { dg-do compile } */ |
| /* { dg-options "-fblocks" } */ |
| |
| typedef void (^CL)(void); |
| |
| CL foo() { |
| short y; |
| short (^add1)(void) = ^{ return y+1; }; /* { dg-error "cannot initialize a variable" } */ |
| |
| CL X = ^{ |
| if (2) |
| return; |
| return 1; /* { dg-error "return type 'int' must match previous return type 'void' when block literal has unspecified explicit return type" } */ |
| }; |
| |
| int (^Y) (void) = ^{ |
| if (3) |
| return 1; |
| else |
| return; /* { dg-error "return type 'void' must match previous return type 'int' when block literal has unspecified explicit return type" } */ |
| }; |
| |
| char *(^Z)(void) = ^{ /* { dg-error "cannot initialize a variable" } */ |
| if (3) |
| return ""; |
| else |
| return (char*)0; /* { dg-error "return type 'char *' must match previous return type 'const char *' when block literal has unspecified explicit return type" } */ |
| }; |
| |
| double (^A)(void) = ^ { /* { dg-error "cannot initialize a variable" } */ |
| if (1) |
| return (float)1.0; |
| else |
| if (2) |
| return (double)2.0; /* { dg-error "return type 'double' must match previous return type 'float' when block literal has unspecified explicit return type" } */ |
| return 1; /* { dg-error "return type 'int' must match previous return type 'float' when block literal has unspecified explicit return type" } */ |
| }; |
| char *(^B)(void) = ^{ /* { dg-error "cannot initialize a variable" } */ |
| if (3) |
| return ""; |
| else |
| return 2; /* { dg-error "return type 'int' must match previous return type 'const char *' when block literal has unspecified explicit return type" } */ |
| }; |
| |
| __block int i; |
| int& (^o)() = ^ int& { |
| int &ri = i; |
| return ri; |
| }; |
| |
| int (^o1)() = ^ { |
| int &ri = i; |
| return ri; |
| }; |
| o() = 1; |
| |
| return ^{ return 1; }; /* { dg-error "annot initialize return object of type" } */ |
| } |