https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109378
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Also you could do: template <typename Type> inline constexpr Type my_sqrt(const Type x) noexcept { if (std::isless(x, 0.0)) __builtin_unreachable(); return std::sqrt(x); } And GCC will optimize away the check for negative and NAN correctly on the trunk.