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 | |