1*d9b1a4fbSDavid Majnemer // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2*d9b1a4fbSDavid Majnemer 
3*d9b1a4fbSDavid Majnemer template <class T, T... I>
4*d9b1a4fbSDavid Majnemer struct Seq {
5*d9b1a4fbSDavid Majnemer   static constexpr T PackSize = sizeof...(I);
6*d9b1a4fbSDavid Majnemer };
7*d9b1a4fbSDavid Majnemer 
8*d9b1a4fbSDavid Majnemer template <typename T, T N>
9*d9b1a4fbSDavid Majnemer using MakeSeq = __make_integer_seq<Seq, T, N>;
10*d9b1a4fbSDavid Majnemer 
11*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<int, 0>, Seq<int>), "");
12*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<int, 1>, Seq<int, 0>), "");
13*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<int, 2>, Seq<int, 0, 1>), "");
14*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<int, 3>, Seq<int, 0, 1, 2>), "");
15*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<int, 4>, Seq<int, 0, 1, 2, 3>), "");
16*d9b1a4fbSDavid Majnemer 
17*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned int, 0U>, Seq<unsigned int>), "");
18*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned int, 1U>, Seq<unsigned int, 0U>), "");
19*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned int, 2U>, Seq<unsigned int, 0U, 1U>), "");
20*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned int, 3U>, Seq<unsigned int, 0U, 1U, 2U>), "");
21*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned int, 4U>, Seq<unsigned int, 0U, 1U, 2U, 3U>), "");
22*d9b1a4fbSDavid Majnemer 
23*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<long long, 0LL>, Seq<long long>), "");
24*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<long long, 1LL>, Seq<long long, 0LL>), "");
25*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<long long, 2LL>, Seq<long long, 0LL, 1LL>), "");
26*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<long long, 3LL>, Seq<long long, 0LL, 1LL, 2LL>), "");
27*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<long long, 4LL>, Seq<long long, 0LL, 1LL, 2LL, 3LL>), "");
28*d9b1a4fbSDavid Majnemer 
29*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned long long, 0ULL>, Seq<unsigned long long>), "");
30*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned long long, 1ULL>, Seq<unsigned long long, 0ULL>), "");
31*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned long long, 2ULL>, Seq<unsigned long long, 0ULL, 1ULL>), "");
32*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned long long, 3ULL>, Seq<unsigned long long, 0ULL, 1ULL, 2ULL>), "");
33*d9b1a4fbSDavid Majnemer static_assert(__is_same(MakeSeq<unsigned long long, 4ULL>, Seq<unsigned long long, 0ULL, 1ULL, 2ULL, 3ULL>), "");
34*d9b1a4fbSDavid Majnemer 
35*d9b1a4fbSDavid Majnemer template <typename T, T N>
36*d9b1a4fbSDavid Majnemer using ErrorSeq = __make_integer_seq<Seq, T, N>; // expected-error{{must have non-negative sequence length}} \
37*d9b1a4fbSDavid Majnemer                                                    expected-error{{must have integral element type}}
38*d9b1a4fbSDavid Majnemer 
39*d9b1a4fbSDavid Majnemer enum Color : int { Red,
40*d9b1a4fbSDavid Majnemer                    Green,
41*d9b1a4fbSDavid Majnemer                    Blue };
42*d9b1a4fbSDavid Majnemer using illformed1 = ErrorSeq<Color, Blue>; // expected-note{{in instantiation}}
43*d9b1a4fbSDavid Majnemer 
44*d9b1a4fbSDavid Majnemer using illformed2 = ErrorSeq<int, -5>;
45*d9b1a4fbSDavid Majnemer 
46*d9b1a4fbSDavid Majnemer template <typename T, T N> void f() {}
47*d9b1a4fbSDavid Majnemer __make_integer_seq<f, int, 0> x; // expected-error{{template template parameter must be a class template or type alias template}}
48