xref: /aosp_15_r20/external/clang/test/Rewriter/rewrite-block-literal.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -E %s -o %t.mm
2*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s
3*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc -fobjc-runtime=macosx-fragile-10.5 %s -o %t-rw.cpp
4*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
5*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-modern-rw.cpp
6*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-modern-rw.cpp
7*67e74705SXin Li
8*67e74705SXin Li// rdar://11375908
9*67e74705SXin Litypedef unsigned long size_t;
10*67e74705SXin Li
11*67e74705SXin Li// rdar: // 11006566
12*67e74705SXin Li
13*67e74705SXin Livoid I( void (^)(void));
14*67e74705SXin Livoid (^noop)(void);
15*67e74705SXin Li
16*67e74705SXin Livoid nothing();
17*67e74705SXin Liint printf(const char*, ...);
18*67e74705SXin Li
19*67e74705SXin Litypedef void (^T) (void);
20*67e74705SXin Li
21*67e74705SXin Livoid takeblock(T);
22*67e74705SXin Liint takeintint(int (^C)(int)) { return C(4); }
23*67e74705SXin Li
24*67e74705SXin LiT somefunction() {
25*67e74705SXin Li  if (^{ })
26*67e74705SXin Li    nothing();
27*67e74705SXin Li
28*67e74705SXin Li  noop = ^{};
29*67e74705SXin Li
30*67e74705SXin Li  noop = ^{printf("\nClosure\n"); };
31*67e74705SXin Li
32*67e74705SXin Li  I(^{ });
33*67e74705SXin Li
34*67e74705SXin Li  return ^{printf("\nClosure\n"); };
35*67e74705SXin Li}
36*67e74705SXin Livoid test2() {
37*67e74705SXin Li  int x = 4;
38*67e74705SXin Li
39*67e74705SXin Li  takeblock(^{ printf("%d\n", x); });
40*67e74705SXin Li
41*67e74705SXin Li  while (1) {
42*67e74705SXin Li    takeblock(^{
43*67e74705SXin Li        while(1) break;  // ok
44*67e74705SXin Li      });
45*67e74705SXin Li    break;
46*67e74705SXin Li  }
47*67e74705SXin Li}
48*67e74705SXin Li
49*67e74705SXin Livoid test4() {
50*67e74705SXin Li  void (^noop)(void) = ^{};
51*67e74705SXin Li  void (*noop2)() = 0;
52*67e74705SXin Li}
53*67e74705SXin Li
54*67e74705SXin Livoid myfunc(int (^block)(int)) {}
55*67e74705SXin Li
56*67e74705SXin Livoid myfunc3(const int *x);
57*67e74705SXin Li
58*67e74705SXin Livoid test5() {
59*67e74705SXin Li  int a;
60*67e74705SXin Li
61*67e74705SXin Li  myfunc(^(int abcd) {
62*67e74705SXin Li      myfunc3(&a);
63*67e74705SXin Li      return 1;
64*67e74705SXin Li    });
65*67e74705SXin Li}
66*67e74705SXin Li
67*67e74705SXin Livoid *X;
68*67e74705SXin Li
69*67e74705SXin Listatic int global_x = 10;
70*67e74705SXin Livoid (^global_block)(void) = ^{ printf("global x is %d\n", global_x); };
71*67e74705SXin Li
72*67e74705SXin Li// CHECK: static __global_block_block_impl_0 __global_global_block_block_impl_0((void *)__global_block_block_func_0, &__global_block_block_desc_0_DATA);
73*67e74705SXin Li// CHECK: void (*global_block)(void) = ((void (*)())&__global_global_block_block_impl_0);
74*67e74705SXin Li
75*67e74705SXin Litypedef void (^void_block_t)(void);
76*67e74705SXin Li
77*67e74705SXin Listatic const void_block_t myBlock = ^{ };
78*67e74705SXin Li
79*67e74705SXin Listatic const void_block_t myBlock2 = ^ void(void) { };
80