1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
3 static_assert(__has_builtin(__make_integer_seq
), "");
5 template <class T
, T
... I
>
7 static constexpr T PackSize
= sizeof...(I
);
10 template <typename T
, T N
>
11 using MakeSeq
= __make_integer_seq
<Seq
, T
, N
>;
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>), "");
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>), "");
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>), "");
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>), "");
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
}}
41 enum Color
: int { Red
,
44 using illformed1
= ErrorSeq
<Color
, Blue
>; // expected-note{{in instantiation}}
46 using illformed2
= ErrorSeq
<int, -5>; // expected-note{{in instantiation}}
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}}
51 __make_integer_seq
<__make_integer_seq
, int, 10> PR28494
; // expected-error{{different template parameters}}
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}}