145
|
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;
|
|
13 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>
|
|
31 constexpr S (const T (&input)[N], std::index_sequence<I...>) noexcept : content{input[I]...} { }
|
|
32 constexpr S (const T (&input)[N]) noexcept : S (input, std::make_index_sequence<N> ()) { }
|
|
33 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 }
|
|
44 constexpr const T *begin () const noexcept
|
|
45 {
|
|
46 return content;
|
|
47 }
|
|
48 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
|
|
62 foo ()
|
|
63 {
|
|
64 F<"test"> f;
|
|
65 }
|