Home | History | Annotate | Download | only in dcl.fct
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fcxx-exceptions -fexceptions -verify %s
      2 
      3 // When it is part of a parameter-declaration-clause, the parameter
      4 // pack is a function parameter pack.
      5 template<typename ...Types>
      6 void f0(Types ...args);
      7 
      8 template<typename ...Types>
      9 void f1(const Types &...args);
     10 
     11 // [ Note: Otherwise, the parameter-declaration is part of a
     12 // template-parameter-list and the parameter pack is a template
     13 // parameter pack; see 14.1. -- end note ]
     14 template<int ...N>
     15 struct X0 { };
     16 
     17 template<typename ...Types>
     18 struct X1 {
     19   template<Types ...Values> struct Inner;
     20 };
     21 
     22 // A declarator-id or abstract-declarator containing an ellipsis shall
     23 // only be used in a parameter-declaration.
     24 int (...f2)(int); // expected-error{{only function and template parameters can be parameter packs}}
     25 
     26 void f3() {
     27   int ...x; // expected-error{{only function and template parameters can be parameter packs}}
     28   if (int ...y = 17) { }  // expected-error{{only function and template parameters can be parameter packs}}
     29 
     30   for (int ...z = 0; z < 10; ++z) { }  // expected-error{{only function and template parameters can be parameter packs}}
     31 
     32   try {
     33   } catch (int ...e) { // expected-error{{only function and template parameters can be parameter packs}}
     34   }
     35 }
     36 
     37 template<typename ...Types>
     38 struct X2 {
     39   Types ...members; // expected-error{{only function and template parameters can be parameter packs}} \
     40                     // expected-error{{data member type contains unexpanded parameter pack}}
     41 };
     42 
     43 // The type T of the declarator-id of the function parameter pack
     44 // shall contain a template parameter pack; each template parameter
     45 // pack in T is expanded by the function parameter pack.
     46 template<typename T>
     47 void f4(T ...args); // expected-error{{type 'T' of function parameter pack does not contain any unexpanded parameter packs}}
     48 
     49