blob: 93a0e4907d290dff00da2da5ece66c7e8c0bbec2 [file] [log] [blame]
Richard Smith762bb9d2011-10-13 22:29:44 +00001// RUN: %clang_cc1 -emit-llvm-only -std=c++11 -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-fragile-abi %s
Fariborz Jahanianff365592011-05-05 17:18:12 +00002// 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}
Douglas Gregor6a576ab2011-06-05 05:04:23 +000035
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}