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-error {{parameter name omitted}} \ |
35 | // expected-error {{parameter name omitted}} |
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 | |