xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenObjCXX/mangle-blocks.mm (revision 0b98e8aad89f2bd4ba80b523d73cf29e9dd82ce1)
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: @_ZGVZZ3foovEUb_E5value = internal global i64 0
4// CHECK: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub_E1k = linkonce_odr global i32 0
5// CHECK: @_ZZ26externally_visible_statics1S1xMUb_E1j = linkonce_odr global i32 0
6// CHECK: @_ZZZN26externally_visible_statics10inlinefuncEvEUb_E1i = 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]EUb0_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: @_ZZZN1N3barEvEUb2_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: @_ZZZN1CC1EvEUb3_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  struct S {
74    int x = ^{
75      static int j = f();
76      return j;
77    }();
78    void foo(int y = ^{ static int k = f(); return k; }()) {}
79  };
80  void g() {
81    inlinefunc();
82    S s;
83    s.foo();
84  }
85}
86