https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87372
--- Comment #2 from eric-bugs at omnifarious dot org --- Also, this works in clang 6.0 (with --std=c++17), but not gcc 8.2: -------- #include <array> constexpr int ce_strlen(char const *s) { int i = 0; while (s[i]) ++i; return i; } template <int len> constexpr auto as_array(char const *s) { ::std::array<char, len + 1> output{}; for (int i = 0; i < len; ++i) { output[i] = s[i]; } output[output.size() - 1] = '\0'; return output; } template <unsigned long s1, unsigned long s2> constexpr auto paste_array(::std::array<char, s1> a, ::std::array<char, s2> b) { constexpr unsigned long tlen = s1 + s2 - 1; ::std::array<char, tlen> output{}; int o = 0; for (unsigned long i = 0; i < s1; ++i, ++o) { output[o] = a[i]; } --o; for (unsigned long i = 0; i < s2; ++i, ++o) { output[o] = b[i]; } return output; } #define stringify(x) #x #define evstringify(x) stringify(x) char const * joe() { constexpr static auto mystr = paste_array(paste_array(as_array<ce_strlen(__PRETTY_FUNCTION__)>(__PRETTY_FUNCTION__), as_array<sizeof(" at line ") - 1>(" at line ")), as_array<ce_strlen(evstringify(__LINE__))>(evstringify(__LINE__))); return mystr.data(); }