xref: /aosp_15_r20/external/clang/test/CodeGenCXX/reference-in-blocks.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fblocks %s -emit-llvm -o %t
2*67e74705SXin Li 
3*67e74705SXin Li extern "C" int printf(const char*, ...);
4*67e74705SXin Li 
5*67e74705SXin Li template<typename T> class range {
6*67e74705SXin Li public:
7*67e74705SXin Li T _i;
range(T i)8*67e74705SXin Li         range(T i) {_i = i;};
get()9*67e74705SXin Li         T get() {return _i;};
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li // rdar: // 7495203
13*67e74705SXin Li class A {
14*67e74705SXin Li     public:
A()15*67e74705SXin Li 	A() : field(10), d1(3.14) {}
16*67e74705SXin Li 	void F();
S()17*67e74705SXin Li 	void S() {
18*67e74705SXin Li 	  printf(" field = %d\n", field);
19*67e74705SXin Li 	  printf(" field = %f\n", d1);
20*67e74705SXin Li 	}
21*67e74705SXin Li 	int field;
22*67e74705SXin Li 	double d1;
23*67e74705SXin Li };
24*67e74705SXin Li 
F()25*67e74705SXin Li void A::F()
26*67e74705SXin Li     {
27*67e74705SXin Li 	__block A &tlc = *this;
28*67e74705SXin Li 	// crashed in code gen (radar 7495203)
29*67e74705SXin Li         ^{ tlc.S(); }();
30*67e74705SXin Li     }
31*67e74705SXin Li 
main()32*67e74705SXin Li int main() {
33*67e74705SXin Li 
34*67e74705SXin Li         // works
35*67e74705SXin Li         void (^bl)(range<int> ) = ^(range<int> i){printf("Hello Blocks %d\n", i.get()); };
36*67e74705SXin Li 
37*67e74705SXin Li         //crashes in godegen?
38*67e74705SXin Li         void (^bl2)(range<int>& ) = ^(range<int>& i){printf("Hello Blocks %d\n", i.get()); };
39*67e74705SXin Li 
40*67e74705SXin Li 	A *a = new A;
41*67e74705SXin Li 	a->F();
42*67e74705SXin Li         return 0;
43*67e74705SXin Li }
44