1 // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks 2 3 void take(void*); 4 5 void test() { 6 take(^(int x){}); 7 take(^(int x, int y){}); 8 take(^(int x, int y){}); 9 take(^(int x, // expected-note {{previous declaration is here}} 10 int x){}); // expected-error {{redefinition of parameter 'x'}} 11 12 13 take(^(int x) { return x+1; }); 14 15 int (^CP)(int) = ^(int x) { return x*x; }; 16 take(CP); 17 18 int arg; 19 ^{return 1;}(); 20 ^{return 2;}(arg); // expected-error {{too many arguments to block call}} 21 ^(void){return 3;}(1); // expected-error {{too many arguments to block call}} 22 ^(){return 4;}(arg); // expected-error {{too many arguments to block call}} 23 ^(int x, ...){return 5;}(arg, arg); // Explicit varargs, ok. 24 } 25 26 int main(int argc, char** argv) { 27 ^(int argCount) { 28 argCount = 3; 29 }(argc); 30 } 31 32 // radar 7528255 33 void f0() { 34 ^(int, double d, char) {}(1, 1.34, 'a'); // expected-warning {{omitting the parameter name in a function definition is a C2x extension}} \ 35 // expected-warning {{omitting the parameter name in a function definition is a C2x extension}} 36 } 37 38 // rdar://problem/8962770 39 void test4() { 40 int (^f)() = ^((x)) { }; // expected-warning {{type specifier missing}} expected-error {{type-id cannot have a name}} 41 } 42 43 // rdar://problem/9170609 44 void test5_helper(void (^)(int, int[*])); 45 void test5(void) { 46 test5_helper(^(int n, int array[n]) {}); 47 } 48 49 // Reduced from a problem on platforms where va_list is an array. 50 struct tag { 51 int x; 52 }; 53 typedef struct tag array_ty[1]; 54 void test6(void) { 55 void (^block)(array_ty) = ^(array_ty arr) { }; 56 array_ty arr; 57 block(arr); 58 } 59