1 // RUN: %clang_cc1 -emit-llvm-only -std=c++0x -fblocks -o - -triple x86_64-apple-darwin10 %s 2 // rdar://9362021 3 4 @class DYFuture; 5 @interface NSCache 6 - (void)setObject:(id)obj forKey:(id)key; 7 @end 8 9 template <typename T> 10 class ResourceManager 11 { 12 public: 13 ~ResourceManager(); 14 DYFuture* XXX(); 15 NSCache* _spDeviceCache; 16 }; 17 18 template <typename T> 19 DYFuture* ResourceManager<T>::XXX() 20 { 21 ^ { 22 [_spDeviceCache setObject:0 forKey:0]; 23 }(); 24 25 return 0; 26 } 27 28 struct AnalyzerBaseObjectTypes { }; 29 30 void FUNC() 31 { 32 ResourceManager<AnalyzerBaseObjectTypes> *rm; 33 ^(void) { rm->XXX(); }(); 34 } 35 36 namespace PR9982 { 37 template<typename T> struct Curry; 38 39 template<typename R, typename Arg0, typename Arg1, typename Arg2> 40 struct Curry<R (^)(Arg0, Arg1, Arg2)> 41 { 42 typedef R (^FType)(Arg0, Arg1, Arg2); 43 44 Curry(FType _f) : f(_f) {} 45 ~Curry() {;} 46 47 R (^(^operator()(Arg0 a))(Arg1))(Arg2) 48 { 49 auto block = ^(Arg1 b) { 50 auto inner_block = ^(Arg2 c) { 51 return f(a, b, c); 52 }; 53 return inner_block; 54 }; 55 return block; 56 } 57 58 private: 59 FType f; 60 }; 61 62 auto add = ^(int a, int b, int c) 63 { 64 return a + b + c; 65 }; 66 67 void curry() { 68 Curry<__decltype(add)> c = Curry<__decltype(add)>(add); 69 auto t = c(1)(10)(100); 70 } 71 } 72