Home | History | Annotate | Download | only in temp.variadic
      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