Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      2 
      3 static_assert(__has_builtin(__make_integer_seq), "");
      4 
      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}}
     50 
     51 __make_integer_seq<__make_integer_seq, int, 10> PR28494; // expected-error{{different template parameters}}
     52 // expected-note (at) make_integer_seq.cpp:* {{template parameter has a different kind}}
     53 // expected-note (at) make_integer_seq.cpp:* {{previous template template parameter is here}}
     54