// 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}}
}

