1// RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks 2 3void take(void*); 4 5void 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 26int main(int argc, char** argv) { 27 ^(int argCount) { 28 argCount = 3; 29 }(argc); 30} 31 32// radar 7528255 33void f0() { 34 ^(int, double d, char) {}(1, 1.34, 'a'); // expected-error {{parameter name omitted}} \ 35 // expected-error {{parameter name omitted}} 36} 37 38// rdar://problem/8962770 39void test4() { 40 int (^f)() = ^((x)) { }; // expected-error {{expected ')'}} expected-warning {{type specifier missing}} expected-note {{to match this}} 41} 42 43// rdar://problem/9170609 44void test5_helper(void (^)(int, int[*])); 45void 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. 50struct tag { 51 int x; 52}; 53typedef struct tag array_ty[1]; 54void test6(void) { 55 void (^block)(array_ty) = ^(array_ty arr) { }; 56 array_ty arr; 57 block(arr); 58} 59