1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks
7 int (^PFR) (int) = 0; // OK
16 if (PFR == (int (^) (int))IFP) // OK
28 return PFR != IFP; // OK
31 int test2(double (^S)()) {
32 double (^I)(int) = (void*) S;
33 (void*)I = (void *)S; // expected-error {{assignment to cast is illegal, lvalue casts are not supported}}
41 return (void*)I == (void *)S;
44 int^ x; // expected-error {{block pointer to non-function type is invalid}}
45 int^^ x1; // expected-error {{block pointer to non-function type is invalid}} expected-error {{block pointer to non-function type is invalid}}
48 char *^ y; // expected-error {{block pointer to non-function type is invalid}}
53 enum {NSBIRLazilyAllocated = 0};
55 int test4(int argc) { // rdar://6251437
58 case NSBIRLazilyAllocated: // is an integer constant expression.
68 // rdar://6257721 - reference to static/global is byref by default.
71 bar(^{ test5g = 1; });
74 // rdar://6405429 - __func__ in a block refers to the containing function name.
81 // radr://6732116 - block comparisons
83 int test7(void (^p)()) {
90 ^{ goto somelabel; }(); // expected-error {{use of undeclared label 'somelabel'}}
94 goto somelabel; // expected-error {{use of undeclared label 'somelabel'}}
101 ^{ case 42: ; }(); // expected-error {{'case' statement not in switch statement}}
108 ^{ break; }(); // expected-error {{'break' statement not in loop or switch statement}}
112 ^{ break; }(); // expected-error {{'break' statement not in loop or switch statement}}
115 void (^test12f)(void);
117 test12f = ^test12f; // expected-error {{type name requires a specifier or qualifier}} expected-error {{expected expression}}
125 return X+4; // References outer block's "X", so outer block is constant.
131 static void *P = ^{ // expected-error {{initializer element is not a compile-time constant}}
134 // References test14's "X": outer block is non-constant.
142 void foo(long (^comp)()) { // expected-note{{passing argument to parameter 'comp' here}}
145 void (^test15f)(void);
147 foo(^{ return LESS; }); // expected-error {{incompatible block pointer types passing 'int (^)(void)' to parameter of type 'long (^)()'}}
150 __block int test16i; // expected-error {{__block attribute not allowed, only allowed on local variables}}
152 void test16(__block int i) { // expected-error {{__block attribute not allowed, only allowed on local variables}}
154 extern __block double extern_var; // expected-error {{__block attribute not allowed, only allowed on local variables}}
155 static __block char * pch; // expected-error {{__block attribute not allowed, only allowed on local variables}}
156 __block int a[size]; // expected-error {{__block attribute not allowed on declaration with a variably modified type}}
157 __block int (*ap)[size]; // expected-error {{__block attribute not allowed on declaration with a variably modified type}}
171 (void)(bp > rp); // expected-error {{invalid operands}}
172 (void)(bp > 0); // expected-error {{invalid operands}}
173 (void)(bp > bp); // expected-error {{invalid operands}}
174 (void)(bp > vp); // expected-error {{invalid operands}}
175 f(1 ? bp : rp); // expected-error {{incompatible operand types ('void (^)(int)' and 'void (*)(int)')}}
176 (void)(bp == 1); // expected-error {{invalid operands to binary expression}}
178 (void)(1 == bp); // expected-error {{invalid operands to binary expression}}
180 (void)(bp < 1); // expected-error {{invalid operands to binary expression}}
181 (void)(bp < 0); // expected-error {{invalid operands to binary expression}}
182 (void)(1 < bp); // expected-error {{invalid operands to binary expression}}
183 (void)(0 < bp); // expected-error {{invalid operands to binary expression}}
187 void (^const blockA)(void) = ^{ }; // expected-note {{variable 'blockA' declared const here}}
188 blockA = ^{ }; // expected-error {{cannot assign to variable 'blockA' with const-qualified type 'void (^const)(void)}}
193 goto L0; // expected-error {{cannot jump}}
195 __block int x; // expected-note {{jump bypasses setup of __block variable}}
205 int vla[n]; // expected-note {{declared here}}
206 int (*vm)[n] = 0; // expected-note {{declared here}}
209 (void)vla[1]; // expected-error {{cannot refer to declaration with a variably modified type inside block}}
210 (void)(vm+1); // expected-error {{cannot refer to declaration with a variably modified type inside block}}
216 int a[7]; // expected-note {{declared here}}
217 __block int b[10]; // expected-note {{declared here}}
220 (void)a[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
221 (void)b[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
226 const char * (^func)(void) = ^{ return __func__; };
227 const char * (^function)(void) = ^{ return __FUNCTION__; };
228 const char * (^pretty)(void) = ^{ return __PRETTY_FUNCTION__; };