1 | // RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s |
2 | |
3 | // CHECK-DAG: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub_E1k = linkonce_odr global i32 0 |
4 | // CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb_E1i = linkonce_odr global i32 0 |
5 | // CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb0_E1j = linkonce_odr global i32 0 |
6 | // CHECK-DAG: @_ZZ26externally_visible_statics1S1xMUb_E1j = linkonce_odr global i32 0 |
7 | |
8 | int f(); |
9 | |
10 | void foo() { |
11 | // CHECK-LABEL: define internal i32 @___Z3foov_block_invoke |
12 | // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZZ3foovEUb_E5value |
13 | (void)^(int x) { |
14 | static int value = f(); |
15 | return x + value; |
16 | }; |
17 | } |
18 | |
19 | // CHECK-LABEL: define internal i32 @i_block_invoke |
20 | int i = ^(int x) { return x;}(i); |
21 | |
22 | @interface A |
23 | - (void)method; |
24 | @end |
25 | |
26 | @implementation A |
27 | - (void)method { |
28 | // CHECK: define internal signext i8 @"__11-[A method]_block_invoke" |
29 | (void)^(int x) { |
30 | // CHECK: @"_ZZZ11-[A method]EUb1_E4name" |
31 | static const char *name = "hello"; |
32 | return name[x]; |
33 | }; |
34 | } |
35 | @end |
36 | |
37 | void foo(int) { |
38 | (void)^(int x) { |
39 | static const char *name = "hello"; |
40 | return name[x]; |
41 | }; |
42 | } |
43 | |
44 | namespace N { |
45 | // CHECK-LABEL: define internal signext i8 @___Z3fooi_block_invoke |
46 | void bar() { |
47 | (void)^(int x) { |
48 | // CHECK: @_ZZZN1N3barEvEUb3_E4name |
49 | static const char *name = "hello"; |
50 | return name[x]; |
51 | }; |
52 | } |
53 | } |
54 | |
55 | class C { |
56 | C(); |
57 | }; |
58 | C::C() { |
59 | (void)^(int x) { |
60 | // CHECK: @_ZZZN1CC1EvEUb4_E5nameb |
61 | static const char *nameb = "hello"; |
62 | return nameb[x]; |
63 | }; |
64 | } |
65 | |
66 | int f(); |
67 | namespace externally_visible_statics { |
68 | inline void inlinefunc() { |
69 | ^{ |
70 | static int i = f(); |
71 | }(); |
72 | ^{ |
73 | static int j = f(); |
74 | }(); |
75 | } |
76 | struct S { |
77 | int x = ^{ |
78 | static int j = f(); |
79 | return j; |
80 | }(); |
81 | void foo(int y = ^{ static int k = f(); return k; }()) {} |
82 | }; |
83 | void g() { |
84 | inlinefunc(); |
85 | S s; |
86 | s.foo(); |
87 | } |
88 | } |
89 | |