/* APPLE LOCAL file radar 5732232 - blocks */ /* { dg-do compile } */ /* { dg-options "-fblocks" } */ int (^IFP) (); int (^II) (int); int main() { int (^PFR) (int) = IFP; /* { dg-error "incompatible block pointer types initializing" } */ PFR = II; int (^IFP) () = PFR; /* This is now ok in c (radar 6196572) */ const int (^CIC) () = IFP; const int (^CICC) () = CIC; int * const (^IPCC) () = 0; int * const (^IPCC1) () = IPCC; int * (^IPCC2) () = IPCC; int (^IPCC3) (const int) = PFR; int (^IPCC4) (int, char (^CArg) (double)); int (^IPCC5) (int, char (^CArg) (double)) = IPCC4; int (^IPCC6) (int, char (^CArg) (float)) = IPCC4; /* { dg-error "incompatible block pointer types initializing" } */ IPCC2 = 0; IPCC2 = 1; /* { dg-error "invalid conversion assigning integer" } */ int (^x)() = 0; int (^y)() = 3; /* { dg-error "invalid conversion initializing integer" } */ int a = 1; int (^z)() = a+4; /* { dg-error "invalid conversion initializing integer" } */ return 0; } int blah() { int (^IFP) (float); char (^PCP)(double, double, char); IFP(1.0); IFP (1.0, 2.0); /* { dg-error "too many arguments to block call" } */ char ch = PCP(1.0, 2.0, 'a'); return PCP(1.0, 2.0); /* { dg-error "too few arguments to block" } */ } void foo() { /* compare with: int (*xx1)(char *s); int (*xx2)(const char *s) = xx1; */ /* APPLE LOCAL radar 6246965 */ int (^xx)(const char *s) = ^(char *s) { return 1; }; /* { dg-error "incompatible block pointer types initializing" } */ }