// { dg-do compile { target c++20 } } // { dg-options "-g" } typedef __SIZE_TYPE__ size_t; namespace std { template struct integer_sequence { typedef T value_type; static constexpr size_t size () noexcept { return sizeof...(I); } }; template using make_integer_sequence = integer_sequence; template using index_sequence = integer_sequence; template using make_index_sequence = make_integer_sequence; } template struct S { T content[N]; using char_type = T; template constexpr S (const T (&input)[N], std::index_sequence) noexcept : content{input[I]...} { } constexpr S (const T (&input)[N]) noexcept : S (input, std::make_index_sequence ()) { } constexpr size_t size () const noexcept { if (content[N - 1] == '\0') return N - 1; else return N; } constexpr T operator[] (size_t i) const noexcept { return content[i]; } constexpr const T *begin () const noexcept { return content; } constexpr const T *end () const noexcept { return content + size (); } }; template S (const T (&)[N]) -> S; template struct F { }; auto foo () { F<"test"> f; }