xref: /aosp_15_r20/external/clang/test/CodeGenCXX/instantiate-blocks.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fblocks -emit-llvm -o - %s
2*67e74705SXin Li // rdar : // 6182276
3*67e74705SXin Li 
foo(T t)4*67e74705SXin Li template <typename T> T foo(T t)
5*67e74705SXin Li {
6*67e74705SXin Li     void (^block)(int);
7*67e74705SXin Li     return 1;
8*67e74705SXin Li }
9*67e74705SXin Li 
test1(void)10*67e74705SXin Li int test1(void)
11*67e74705SXin Li {
12*67e74705SXin Li     int i = 1;
13*67e74705SXin Li     int b = 2;
14*67e74705SXin Li     i = foo(b);
15*67e74705SXin Li     return 0;
16*67e74705SXin Li }
17*67e74705SXin Li 
foo(T t,T1 r)18*67e74705SXin Li template <typename T, typename T1> void foo(T t, T1 r)
19*67e74705SXin Li {
20*67e74705SXin Li     T block_arg;
21*67e74705SXin Li     __block T1 byref_block_arg;
22*67e74705SXin Li 
23*67e74705SXin Li     T1 (^block)(char, T, T1, double) =
24*67e74705SXin Li 	^ T1 (char ch, T arg, T1 arg2, double d1) { byref_block_arg = arg2;
25*67e74705SXin Li            					    return byref_block_arg + block_arg + arg; };
26*67e74705SXin Li 
27*67e74705SXin Li     void (^block2)() = ^{};
28*67e74705SXin Li }
29*67e74705SXin Li 
test2(void)30*67e74705SXin Li void test2(void)
31*67e74705SXin Li {
32*67e74705SXin Li     foo(100, 'a');
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li namespace rdar6182276 {
36*67e74705SXin Li extern "C" {
37*67e74705SXin Li int printf(const char *, ...);
38*67e74705SXin Li }
39*67e74705SXin Li 
foo(T t)40*67e74705SXin Li template <typename T> T foo(T t)
41*67e74705SXin Li {
42*67e74705SXin Li     void (^testing)(int) = ^(int bar) { printf("bar is %d\n", bar); };
43*67e74705SXin Li     printf("bar is\n");
44*67e74705SXin Li     return 1;
45*67e74705SXin Li }
46*67e74705SXin Li 
gorf(T t)47*67e74705SXin Li template <typename T> void gorf(T t)
48*67e74705SXin Li {
49*67e74705SXin Li     foo(t);
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li 
test(void)53*67e74705SXin Li void test(void)
54*67e74705SXin Li {
55*67e74705SXin Li     gorf(2);
56*67e74705SXin Li }
57*67e74705SXin Li }
58*67e74705SXin Li 
59*67e74705SXin Li 
60