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