1 // { dg-do compile { target c++2a } }
2 // { dg-options "-g" }
3 
4 typedef __SIZE_TYPE__ size_t;
5 
6 namespace std
7 {
8 
9 template <typename T, T... I>
10 struct integer_sequence
11 {
12   typedef T value_type;
sizeinteger_sequence13   static constexpr size_t size () noexcept { return sizeof...(I); }
14 };
15 
16 template <typename T, T N>
17 using make_integer_sequence = integer_sequence<T, __integer_pack (N)...>;
18 
19 template <size_t... I>
20 using index_sequence = integer_sequence<size_t, I...>;
21 
22 template <size_t N>
23 using make_index_sequence = make_integer_sequence<size_t, N>;
24 }
25 
26 template <typename T, size_t N> struct S
27 {
28   T content[N];
29   using char_type = T;
30   template <size_t... I>
SS31   constexpr S (const T (&input)[N], std::index_sequence<I...>) noexcept : content{input[I]...} { }
SS32   constexpr S (const T (&input)[N]) noexcept : S (input, std::make_index_sequence<N> ()) { }
sizeS33   constexpr size_t size () const noexcept
34   {
35     if (content[N - 1] == '\0')
36       return N - 1;
37     else
38       return N;
39   }
40   constexpr T operator[] (size_t i) const noexcept
41   {
42     return content[i];
43   }
beginS44   constexpr const T *begin () const noexcept
45   {
46     return content;
47   }
endS48   constexpr const T *end () const noexcept
49   {
50     return content + size ();
51   }
52 };
53 
54 template <typename T, size_t N> S (const T (&)[N]) -> S<T, N>;
55 
56 template <S S>
57 struct F
58 {
59 };
60 
61 auto
foo()62 foo ()
63 {
64   F<"test"> f;
65 }
66