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