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