1 // RUN: %clang_cc1 -fsyntax-only -Wno-strict-prototypes -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.
75 const char*test6(void) {
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__
; };