2008-12-05 07:20:07 +08:00
|
|
|
// RUN: clang -fsyntax-only -verify %s -fblocks
|
2008-09-06 06:11:13 +08:00
|
|
|
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;
|
2008-11-18 03:51:54 +08:00
|
|
|
(void*)I = (void *)S; // expected-error {{assignment to cast is illegal, lvalue casts are not supported}}
|
2008-09-06 06:11:13 +08:00
|
|
|
|
|
|
|
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}}
|
|
|
|
}
|
|
|
|
|
2008-09-28 13:30:26 +08:00
|
|
|
|
|
|
|
|
|
|
|
enum {NSBIRLazilyAllocated = 0};
|
|
|
|
|
|
|
|
int test4(int argc) { // rdar://6251437
|
|
|
|
^{
|
|
|
|
switch (argc) {
|
|
|
|
case NSBIRLazilyAllocated: // is an integer constant expression.
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}();
|
|
|
|
return 0;
|
|
|
|
}
|
2008-10-20 13:16:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
// rdar://6257721 - reference to static/global is byref by default.
|
|
|
|
static int test5g;
|
|
|
|
void test5() {
|
|
|
|
bar(^{ test5g = 1; });
|
|
|
|
}
|
|
|
|
|
2008-12-05 07:50:19 +08:00
|
|
|
// rdar://6405429 - __func__ in a block refers to the containing function name.
|
|
|
|
const char*test6() {
|
|
|
|
return ^{
|
|
|
|
return __func__;
|
|
|
|
} ();
|
|
|
|
}
|
|
|
|
|