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