https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113200
Bug ID: 113200 Summary: std::char_traits<char>::move is not constexpr when the argument is a string literal Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: pdimov at gmail dot com Target Milestone: --- ``` #include <string> #include <cassert> template<std::size_t N> struct S { char data_[ N ]; using traits_type = std::char_traits<char>; constexpr S( char const* p ): data_{} { std::size_t n = traits_type::length( p ); assert( n < N ); traits_type::move( data_, p, n + 1 ); } }; template<std::size_t N> S( char const(&)[N] ) -> S<N>; constexpr S s( "test" ); ``` (https://godbolt.org/z/PofY8MP6G) fails with ``` In file included from /opt/compiler-explorer/gcc-trunk-20240102/include/c++/14.0.0/string:42, from <source>:1: <source>:22:23: in 'constexpr' expansion of 'S<5>(((const char*)"test"))' <source>:16:26: in 'constexpr' expansion of 'std::char_traits<char>::move(((char*)(&((S<5>*)this)->S<5>::data_)), p, (n + 1))' /opt/compiler-explorer/gcc-trunk-20240102/include/c++/14.0.0/bits/char_traits.h:423:50: in 'constexpr' expansion of '__gnu_cxx::char_traits<char>::move(__s1, __s2, __n)' /opt/compiler-explorer/gcc-trunk-20240102/include/c++/14.0.0/bits/char_traits.h:230:20: error: '(((const __gnu_cxx::char_traits<char>::char_type*)(& s.S<5>::data_)) == ((const char*)"test"))' is not a constant expression 230 | if (__s1 == __s2) // unlikely, but saves a lot of work | ~~~~~^~~~~~~ ``` (Reduced from a similar failure in Boost.StaticString.)