https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86590
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Richard Biener from comment #8) > So I've analyzed it more and it is because > > static _GLIBCXX17_CONSTEXPR size_t > length(const char_type* __s) > { > #if __cplusplus >= 201703L > if (__constant_string_p(__s)) > return __gnu_cxx::char_traits<char_type>::length(__s); > #endif > return __builtin_strlen(__s); > } > > confuses us because of the stupid structure of __constant_string_p. > > Is this some odd requirement of O(1) length for constant strings? Why not > make it constexpr evaluated instead? Didn't we invent some special > __builtin_constant_p for this? __constexpr_p ()? Quoting > __constant_string_p: > > template<typename _CharT> > static _GLIBCXX_ALWAYS_INLINE constexpr bool > __constant_string_p(const _CharT* __s) > { > while (__builtin_constant_p(*__s) && *__s) > __s++; > return __builtin_constant_p(*__s); > } I think it is a poor man's workaround for the constexpr evaluation, until the FE can handle the memory/string builtins in constexpr evaluation. We need some helper routines for constexpr reading and storing a character to a certain pointer, and then basically open-code the needed builtins using those two helpers. Is the problem __constant_string_p implementation or the __gnu_cxx::char_traits<char_type>::length(__s); part? If only __constant_string_p, then it might be enough to handle constexpr evaluation of __builtin_strlen. Is the problem that when optimizing we defer the __builtin_constant_p evaluation until fab? Perhaps my https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00355.html patch would help here instead?