1 // RUN: %clang_cc1 -std=c++11 -fblocks -fsyntax-only -verify %s
2 
3 // Tests the use of blocks with variadic templates.
4 template<typename ...Args>
5 int f0(Args ...args) {
6   return ^ {
7     return sizeof...(Args);
8   }() + ^ {
9     return sizeof...(args);
10   }();
11 }
12 
13 template<typename ...Args>
14 int f1(Args ...args) {
15   return ^ {
16     return f0(args...);
17   }();
18 }
19 
20 template int f0(int, float, double);
21 template int f1(const char*, int, float, double);
22 
23 template<typename ...Args>
24 int f2(Args ...args) {
25   return ^(Args ...block_args) {
26     return f1(block_args...);
27   }(args + 0 ...);
28 }
29 
30 template int f2(const char*, int, float, double);
31 
32 template<typename ...Args>
33 int f3(Args ...args) {
34   return ^(Args *...block_args) {
35     return f1(block_args...);
36   }(&args...);
37 }
38 
39 template int f3(const char*, int, float, double);
40 
41 template<typename ...Args>
42 int PR9953(Args ...args) {
43   return ^(Args *...block_args) {
44     return f1(block_args); // expected-error{{expression contains unexpanded parameter pack 'block_args'}}
45   }(&args...);
46 }
47