block-args.c revision da263795abd39437d73d23fcf34dcd3afc1d7df3
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