diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-10-29 11:14:12 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-10-29 11:14:12 +0100 |
commit | 5e247ac0c28b9a2662f99c4a5420c5f7c2d0c6bd (patch) | |
tree | 53b81c74900577e13633bb04a4607e9a223b7330 /gcc/fortran | |
parent | 61977b8af087a8e0f738a2c51f86ec12c554ec43 (diff) | |
download | gcc-5e247ac0c28b9a2662f99c4a5420c5f7c2d0c6bd.zip gcc-5e247ac0c28b9a2662f99c4a5420c5f7c2d0c6bd.tar.gz gcc-5e247ac0c28b9a2662f99c4a5420c5f7c2d0c6bd.tar.bz2 |
libstdc++: Use if consteval rather than if (std::__is_constant_evaluated()) for {,b}float16_t nextafter [PR117321]
The nextafter_c++23.cc testcase fails to link at -O0.
The problem is that eventhough std::__is_constant_evaluated() has
always_inline attribute, that at -O0 just means that we inline the
call, but its result is still assigned to a temporary which is tested
later, nothing at -O0 propagates that false into the if and optimizes
away the if body. And the __builtin_nextafterf16{,b} calls are meant
to be used solely for constant evaluation, the C libraries don't
define nextafterf16 these days.
As __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__ are predefined right
now only by GCC, not by clang which doesn't implement the extended floating
point types paper, and as they are predefined in C++23 and later modes only,
I think we can just use if consteval which is folded already during the FE
and the body isn't included even at -O0. I've added a feature test for
that just in case clang implements those and implements those in some weird
way. Note, if (__builtin_is_constant_evaluted()) would work correctly too,
that is also folded to false at gimplification time and the corresponding
if block not emitted at all. But for -O0 it can't be wrapped into a helper
inline function.
2024-10-29 Jakub Jelinek <jakub@redhat.com>
PR libstdc++/117321
* include/c_global/cmath (nextafter(_Float16, _Float16)): Use
if consteval rather than if (std::__is_constant_evaluated()) around
the __builtin_nextafterf16 call.
(nextafter(__gnu_cxx::__bfloat16_t, __gnu_cxx::__bfloat16_t)): Use
if consteval rather than if (std::__is_constant_evaluated()) around
the __builtin_nextafterf16b call.
* testsuite/26_numerics/headers/cmath/117321.cc: New test.
Diffstat (limited to 'gcc/fortran')
0 files changed, 0 insertions, 0 deletions