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