multi-level-substitution.cpp revision c3069d618f4661d923cb1b5c4525b082fce73b04
1// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2
3template<typename T, T ...Values> struct value_tuple {};
4
5template<typename T>
6struct X0 {
7  template<T ...Values>
8  void f(value_tuple<T, Values...> * = 0);
9};
10
11void test_X0() {
12  X0<int>().f<1, 2, 3, 4, 5>();
13}
14
15namespace PacksAtDifferentLevels {
16  template<typename...> struct tuple { };
17  template<typename T, typename U> struct pair { };
18
19  template<typename ...Types>
20  struct X {
21    template<typename> struct Inner;
22
23    template<typename ...YTypes>
24    struct Inner<tuple<pair<Types, YTypes>...> > {
25      static const unsigned zero = sizeof...(Types) - sizeof...(YTypes);
26    };
27  };
28
29  int check0[X<short, int, long>::Inner<tuple<pair<short, unsigned short>,
30                                             pair<int, unsigned int>,
31                                             pair<long, unsigned long>>
32                                       >::zero == 0? 1 : -1];
33}
34