| Daniel Dunbar | a572887 | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 2 |  | 
 | 3 | int (*FP)(); | 
 | 4 | int (^IFP) (); | 
 | 5 | int (^II) (int); | 
 | 6 | int main() { | 
 | 7 |   int (*FPL) (int) = FP; // C doesn't consider this an error. | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 8 |  | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 9 |   // For Blocks, the ASTContext::typesAreBlockCompatible() makes sure this is an error. | 
| Eli Friedman | 687abff | 2009-06-08 04:24:21 +0000 | [diff] [blame] | 10 |   int (^PFR) (int) = IFP; // OK | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 11 |   PFR = II;       // OK | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 12 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 13 |   int (^IFP) () = PFR; // OK | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 14 |  | 
 | 15 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 16 |   const int (^CIC) () = IFP; // expected-error {{incompatible block pointer types initializing 'int (^)()', expected 'int const (^)()'}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 17 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 18 |   const int (^CICC) () = CIC; | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 19 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 20 |   int * const (^IPCC) () = 0; | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 21 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 22 |   int * const (^IPCC1) () = IPCC; | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 23 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 24 |   int * (^IPCC2) () = IPCC;       // expected-error {{incompatible block pointer types initializing 'int *const (^)()', expected 'int *(^)()'}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 25 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 26 |   int (^IPCC3) (const int) = PFR; | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 27 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 28 |   int (^IPCC4) (int, char (^CArg) (double)); | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 29 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 30 |   int (^IPCC5) (int, char (^CArg) (double)) = IPCC4; | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 31 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 32 |   int (^IPCC6) (int, char (^CArg) (float))  = IPCC4; // expected-error {{incompatible block pointer types initializing 'int (^)(int, char (^)(double))', expected 'int (^)(int, char (^)(float))'}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 33 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 34 |   IPCC2 = 0; | 
 | 35 |   IPCC2 = 1; // expected-error {{invalid conversion assigning integer 'int', expected block pointer 'int *(^)()'}} | 
 | 36 |   int (^x)() = 0; | 
 | 37 |   int (^y)() = 3;   // expected-error {{invalid conversion initializing integer 'int', expected block pointer 'int (^)()'}} | 
 | 38 |   int a = 1; | 
 | 39 |   int (^z)() = a+4;   // expected-error {{invalid conversion initializing integer 'int', expected block pointer 'int (^)()'}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 40 | } | 
 | 41 |  | 
 | 42 | int blah() { | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 43 |   int (^IFP) (float); | 
 | 44 |   char (^PCP)(double, double, char); | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 45 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 46 |   IFP(1.0); | 
 | 47 |   IFP (1.0, 2.0); // expected-error {{too many arguments to block call}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 48 |  | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 49 |   char ch = PCP(1.0, 2.0, 'a'); | 
 | 50 |   return PCP(1.0, 2.0);   // expected-error {{too few arguments to block}} | 
| Steve Naroff | dd972f2 | 2008-09-05 22:11:13 +0000 | [diff] [blame] | 51 | } |