On 17/06/21 22:45 +0100, Jonathan Wakely wrote: >This removes the helper functions added by r8-1294 to detect whether the >char_traits member functions can be evaluated at compile time. Instead, >we can just use __builtin_constant_evaluated directly, which is well >supported by non-GCC compilers by now. > >As a result, there is a chance that those members will no longer be >usable in constant expressions when using old versions of non-GCC >compilers. Make the relevant feature test macros depend on the >availability of __builtin_constant_evaluated, so they are defined only >when the feature is actualyl available. > >The new testcase from the PR is added to the libitm testsuite, because >that's where we can be sure it's OK to use the -fgnu-tm option. > >Signed-off-by: Jonathan Wakely > > PR libstdc++/91488 > >libstdc++-v3/ChangeLog: > > * include/bits/basic_string.h (__cpp_lib_constexpr_string): Only > define when is_constant_evaluated is available. > * include/bits/char_traits.h (__cpp_lib_constexpr_char_traits): > Likewise. > (__constant_string_p, __constant_array_p): Remove. > (char_traits): Use is_constant_evaluated directly. > * include/std/version (__cpp_lib_constexpr_char_traits) > (__cpp_lib_constexpr_string): Only define when > is_constant_evaluated is available. > >libitm/ChangeLog: > > * testsuite/libitm.c++/libstdc++-pr91488.C: New test. The attached patch is the backport. Instead of removing the __constant_string_p and __constant_array_p functions entirely, just give them external linkage. That seems to avoid the bug, and means the release branches can still be used with older non-GCC compilers which don't support __builtin_is_constant_evaluated yet. Tested x86_64-linux. Committed to gcc-11 for now, gcc-10 and gcc-9 to follow soon.