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
8int f();
9
10void 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
20int 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
37void foo(int) {
38  (void)^(int x) {
39    static const char *name = "hello";
40    return name[x];
41  };
42}
43
44namespace 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
55class C {
56  C();
57};
58C::C() {
59  (void)^(int x) {
60    // CHECK: @_ZZZN1CC1EvEUb4_E5nameb
61    static const char *nameb = "hello";
62    return nameb[x];
63  };
64}
65
66int f();
67namespace 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