// RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks void take(void*); void test() { take(^(int x){}); take(^(int x, int y){}); take(^(int x, int y){}); take(^(int x, // expected-note {{previous declaration is here}} int x){}); // expected-error {{redefinition of parameter 'x'}} take(^(int x) { return x+1; }); int (^CP)(int) = ^(int x) { return x*x; }; take(CP); int arg; ^{return 1;}(); ^{return 2;}(arg); // expected-error {{too many arguments to block call}} ^(void){return 3;}(1); // expected-error {{too many arguments to block call}} ^(){return 4;}(arg); // expected-error {{too many arguments to block call}} ^(int x, ...){return 5;}(arg, arg); // Explicit varargs, ok. } int main(int argc, char** argv) { ^(int argCount) { argCount = 3; }(argc); } // radar 7528255 void f0() { ^(int, double d, char) {}(1, 1.34, 'a'); // expected-warning {{omitting the parameter name in a function definition is a C2x extension}} \ // expected-warning {{omitting the parameter name in a function definition is a C2x extension}} } // rdar://problem/8962770 void test4() { int (^f)() = ^((x)) { }; // expected-warning {{type specifier missing}} expected-error {{type-id cannot have a name}} } // rdar://problem/9170609 void test5_helper(void (^)(int, int[*])); void test5(void) { test5_helper(^(int n, int array[n]) {}); } // Reduced from a problem on platforms where va_list is an array. struct tag { int x; }; typedef struct tag array_ty[1]; void test6(void) { void (^block)(array_ty) = ^(array_ty arr) { }; array_ty arr; block(arr); }