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