1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks -std=c++1y |
2 | |
3 | extern "C" int exit(int); |
4 | |
5 | typedef struct { |
6 | unsigned long ps[30]; |
7 | int qs[30]; |
8 | } BobTheStruct; |
9 | |
10 | int main (int argc, const char * argv[]) { |
11 | BobTheStruct inny; |
12 | BobTheStruct outty; |
13 | BobTheStruct (^copyStruct)(BobTheStruct); |
14 | int i; |
15 | |
16 | for(i=0; i<30; i++) { |
17 | inny.ps[i] = i * i * i; |
18 | inny.qs[i] = -i * i * i; |
19 | } |
20 | |
21 | copyStruct = ^(BobTheStruct aBigStruct){ return aBigStruct; }; // pass-by-value intrinsically copies the argument |
22 | |
23 | outty = copyStruct(inny); |
24 | |
25 | if ( &inny == &outty ) { |
26 | exit(1); |
27 | } |
28 | for(i=0; i<30; i++) { |
29 | if ( (inny.ps[i] != outty.ps[i]) || (inny.qs[i] != outty.qs[i]) ) { |
30 | exit(1); |
31 | } |
32 | } |
33 | |
34 | return 0; |
35 | } |
36 | |
37 | namespace rdar8134521 { |
38 | void foo() { |
39 | int (^P)(int) = reinterpret_cast<int(^)(int)>(1); |
40 | P = (int(^)(int))(1); |
41 | |
42 | P = reinterpret_cast<int(^)(int)>((void*)1); |
43 | P = (int(^)(int))((void*)1); |
44 | } |
45 | } |
46 | |
47 | namespace rdar11055105 { |
48 | struct A { |
49 | void foo(); |
50 | }; |
51 | |
52 | template <class T> void foo(T &x) noexcept(noexcept(x.foo())); |
53 | |
54 | void (^block)() = ^{ |
55 | A a; |
56 | foo(a); |
57 | }; |
58 | } |
59 | |
60 | namespace LocalDecls { |
61 | void f() { |
62 | (void) ^{ |
63 | extern int a; // expected-note {{previous}} |
64 | extern int b(); // expected-note {{previous}} |
65 | }; |
66 | } |
67 | void g() { |
68 | (void) ^{ |
69 | extern float a; // expected-error {{different type}} |
70 | extern float b(); // expected-error {{cannot be overloaded}} |
71 | }; |
72 | } |
73 | } |
74 | |