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