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