https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109883

--- Comment #11 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Jakub Jelinek
<ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:c42950e2d380d0da26203fb1eb39497c0a400b2d

commit r13-7341-gc42950e2d380d0da26203fb1eb39497c0a400b2d
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed May 17 21:21:23 2023 +0200

    libstdc++: Fix up some <cmath> templates [PR109883]

    As can be seen on the following testcase, for
   
std::{atan2,fmod,pow,copysign,fdim,fmax,fmin,hypot,nextafter,remainder,remquo,fma}
    if one operand type is std::float{16,32,64,128}_t or std::bfloat16_t and
    another one some integral type or some other floating point type which
    promotes to the other operand's type, we can end up with endless recursion.
    This is because of a declaration ordering problem in <cmath>, where the
    float, double and long double overloads of those functions come before
    the templates which use __gnu_cxx::__promote_{2,3}, but the
    std::float{16,32,64,128}_t and std::bfloat16_t overloads come later in the
    file.  If the result of those promotions is _Float{16,32,64,128} or
    __gnu_cxx::__bfloat16_t, say std::pow(_Float64, int) calls
    std::pow(_Float64, _Float64) and the latter calls itself.

    The following patch fixes that by moving those templates later in the file,
    so that the calls from those templates see also the other overloads.

    I think other templates in the file like e.g. isgreater etc. shouldn't be
    a problem, because those just use __builtin_isgreater etc. in their bodies.

    2023-05-17  Jakub Jelinek  <ja...@redhat.com>

            PR libstdc++/109883
            * include/c_global/cmath (atan2, fmod, pow): Move
            __gnu_cxx::__promote_2 using templates after _Float{16,32,64,128}
and
            __gnu_cxx::__bfloat16_t overloads.
            (copysign, fdim, fmax, fmin, hypot, nextafter, remainder, remquo):
            Likewise.
            (fma): Move __gnu_cxx::__promote_3 using template after
            _Float{16,32,64,128} and __gnu_cxx::__bfloat16_t overloads.

            * testsuite/26_numerics/headers/cmath/constexpr_std_c++23.cc: New
test.

    (cherry picked from commit 883f1e25dc7907c9bb37f480b900336a050218f1)

Reply via email to