1eb2ccd83f07a8c571b5abd3d8ae9915529c49195Ted Kremenek// RUN: %clang_cc1 -fblocks %s -emit-llvm -o %t
26b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian
36b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanianextern "C" int printf(const char*, ...);
46b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian
56b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahaniantemplate<typename T> class range {
66b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanianpublic:
76b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz JahanianT _i;
86b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        range(T i) {_i = i;};
96b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        T get() {return _i;};
106b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian};
116b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian
1250802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian// rdar: // 7495203
1350802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanianclass A {
1450802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian    public:
1550802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	A() : field(10), d1(3.14) {}
1650802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	void F();
1750802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	void S() {
1850802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	  printf(" field = %d\n", field);
1950802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	  printf(" field = %f\n", d1);
2050802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	}
2150802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	int field;
2250802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	double d1;
2350802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian};
2450802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian
2550802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanianvoid A::F()
2650802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian    {
2750802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	__block A &tlc = *this;
2850802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	// crashed in code gen (radar 7495203)
2950802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian        ^{ tlc.S(); }();
3050802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian    }
3150802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian
326b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanianint main() {
336b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian
346b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        // works
356b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        void (^bl)(range<int> ) = ^(range<int> i){printf("Hello Blocks %d\n", i.get()); };
366b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian
376b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        //crashes in godegen?
386b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        void (^bl2)(range<int>& ) = ^(range<int>& i){printf("Hello Blocks %d\n", i.get()); };
3950802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian
4050802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	A *a = new A;
4150802ac72eaba667d8aa96b0cce80b3e2f689d9dFariborz Jahanian	a->F();
426b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian        return 0;
436b2b26cc0b0b304e31bffe984cf2db1c24ec864fFariborz Jahanian}
44