p11-0x.cpp revision 1ed64765624d6f5226dd213e220e038b459972d1
1// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2
3// If a template-parameter of a class template has a default
4// template-argument, each subsequent template-parameter shall either
5// have a default template-argument supplied or be a template
6// parameter pack.
7template<typename> struct vector;
8
9template<typename T = int, typename ...Types> struct X2t;
10template<int V = 0, int ...Values> struct X2nt;
11template<template<class> class M = vector, template<class> class... Metas>
12  struct X2tt;
13
14// If a template-parameter of a primary class template is a template
15// parameter pack, it shall be the last template-parameter .
16template<typename ...Types, // expected-error{{template parameter pack must be the last template parameter}}
17         int After>
18struct X0t;
19
20template<int ...Values, // expected-error{{template parameter pack must be the last template parameter}}
21         int After>
22struct X0nt;
23
24template<template<typename> class ...Templates, // expected-error{{template parameter pack must be the last template parameter}}
25         int After>
26struct X0tt;
27
28// [ Note: These are not requirements for function templates or class
29// template partial specializations because template arguments can be
30// deduced (14.8.2). -- end note]
31template<typename... Types> struct X1t;
32template<typename ...Types, typename T> struct X1t<T, Types...> { };
33
34template<int... Values> struct X1nt;
35template<int ...Values, int V> struct X1nt<V, Values...> { };
36
37// FIXME: Need template template argument packs!
38// template<template<int> class... Meta> struct X1tt;
39// template<template<int> class... Meta, template<int> class M>
40//  struct X1tt<M, Meta...> { };
41
42template<typename ...Types, typename T>
43void f1t(X1t<T, Types...>);
44
45template<int ...Values, int V>
46void f1nt(X1nt<V, Values...>);
47
48// FIXME: Need template template argument packs!
49// template<template<int> class... Meta, template<int> class M>
50// void f1tt(X1tt<M, Meta...>);
51