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