[Bug c++/90784] A loop inside a constexpr function in a constexpr context is not evaluated at compile time
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Jun 8 14:29:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90784
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
While you have a constexpr function, you are not calling it in a constexpr
context (to be precise, it is not manifestly constant-evaluated), you'd need to
use
constexpr auto x = Test(_psz);
for that instead (or make Test consteval in C++20).
std::is_constant_evaluated does only exactly what the standard requires it to
do.
The reason why you don't get it all compile time evaluated is that if it is not
is_constant_evaluated, the std length will then use a builtin function instead
of evaluating it a character by character, but that makes it fail when the
compiler tries to evaluate it as a non-manifestly constant-evaluated constant
expression. And your own length on the other side wants to be evaluated only
as a constant expression, otherwise it isn't optimized well.
So, either don't mix the std code with your implementation, or e.g. use
std::is_constant_evaluated and use strlen in your implementation as well.
More information about the Gcc-bugs
mailing list