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