| // RUN: clang -fsyntax-only -verify %s |
| void donotwarn(); |
| |
| int (^IFP) (); |
| int (^II) (int); |
| int test1() { |
| int (^PFR) (int) = 0; // OK |
| PFR = II; // OK |
| |
| if (PFR == II) // OK |
| donotwarn(); |
| |
| if (PFR == IFP) // expected-error {{comparison of distinct block types}} |
| donotwarn(); |
| |
| if (PFR == (int (^) (int))IFP) // OK |
| donotwarn(); |
| |
| if (PFR == 0) // OK |
| donotwarn(); |
| |
| if (PFR) // OK |
| donotwarn(); |
| |
| if (!PFR) // OK |
| donotwarn(); |
| |
| return PFR != IFP; // expected-error {{comparison of distinct block types}} |
| } |
| |
| int test2(double (^S)()) { |
| double (^I)(int) = (void*) S; |
| (void*)I = (void *)S; // expected-error {{expression is not assignable}} |
| |
| void *pv = I; |
| |
| pv = S; |
| |
| I(1); |
| |
| return (void*)I == (void *)S; |
| } |
| |
| int^ x; // expected-error {{block pointer to non-function type is invalid}} |
| int^^ x1; // expected-error {{block pointer to non-function type is invalid}} |
| |
| int test3() { |
| char *^ y; // expected-error {{block pointer to non-function type is invalid}} |
| } |
| |