1// RUN: %clang_cc1 -emit-llvm-only -std=c++11 -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s 2// rdar://9362021 3 4@class DYFuture; 5@interface NSCache 6- (void)setObject:(id)obj forKey:(id)key; 7@end 8 9template <typename T> 10class ResourceManager 11{ 12public: 13 ~ResourceManager(); 14 DYFuture* XXX(); 15 NSCache* _spDeviceCache; 16}; 17 18template <typename T> 19DYFuture* ResourceManager<T>::XXX() 20{ 21 ^ { 22 [_spDeviceCache setObject:0 forKey:0]; 23 }(); 24 25 return 0; 26} 27 28struct AnalyzerBaseObjectTypes { }; 29 30void FUNC() 31{ 32 ResourceManager<AnalyzerBaseObjectTypes> *rm; 33 ^(void) { rm->XXX(); }(); 34} 35 36namespace 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