block-return.c revision c50a4a5f2eac14ac4c631d50b0a55cadc87700ce
1// RUN: clang -fsyntax-only %s -verify 2 3typedef void (^CL)(void); 4 5CL foo() { 6 7 short y; 8 9 short (^add1)(void) = ^{ return y+1; }; // expected-error {{incompatible block pointer types initializing 'int (^)(void)', expected 'short (^)(void)'}} 10 11 CL X = ^{ 12 if (2) 13 return; 14 return 1; // expected-error {{void block should not return a value}} 15 }; 16 int (^Y) (void) = ^{ 17 if (3) 18 return 1; 19 else 20 return; // expected-error {{non-void block should return a value}} 21 }; 22 23 char *(^Z)(void) = ^{ 24 if (3) 25 return ""; 26 else 27 return (char*)0; 28 }; 29 30 double (^A)(void) = ^ { // expected-error {{incompatible block pointer types initializing 'float (^)(void)', expected 'double (^)(void)'}} 31 if (1) 32 return (float)1.0; 33 else 34 if (2) 35 return (double)2.0; // expected-error {{incompatible type returning 'double', expected 'float'}} 36 return 1; // expected-error {{incompatible type returning 'int', expected 'float'}} 37 }; 38 39 char *(^B)(void) = ^{ 40 if (3) 41 return ""; 42 else 43 return 2; // expected-error {{incompatible type returning 'int', expected 'char *'}} 44 }; 45 return ^{ return 1; }; // expected-error {{incompatible block pointer types returning 'int (^)(void)', expected 'CL'}} expected-error {{returning block that lives on the local stack}} 46} 47 48typedef int (^CL2)(void); 49 50CL2 foo2() { 51 return ^{ return 1; }; // expected-error {{returning block that lives on the local stack}} 52} 53