Bug 101870 - std::lerp is missing Arithmetic overloads
Summary: std::lerp is missing Arithmetic overloads
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 11.2.0
: P3 normal
Target Milestone: 9.5
Assignee: Jonathan Wakely
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-08-12 02:32 UTC by Kostiantyn Pesteriev
Modified: 2022-05-09 16:51 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-08-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Kostiantyn Pesteriev 2021-08-12 02:32:31 UTC
According to C++20 standard paragraph 20.8.1.2, std::lerp is not an exception to expansion of acceptable parameters to integral and mixed floating point types.
I.e. overload 4) from https://en.cppreference.com/w/cpp/numeric/lerp is missing.

Example code (compile with -std=c++20):

#include<cmath>

int main()
{
    std::lerp(int{},int{},int{});
    std::lerp(float{}, double{}, (long double)0);
}

https://godbolt.org/z/3PqP9M4GE

Current behaviour:
Does not compile with: "error: call of overloaded 'lerp(int, int, int)' is ambiguous" and "error: call of overloaded 'lerp(float, double, long double)' is ambiguous".

Expected behaviour:
Compilation with no issues.
Comment 1 GCC Commits 2021-08-12 18:46:46 UTC
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:9017326e19fe278d5f62898cca4682b17f8e8e07

commit r12-2886-g9017326e19fe278d5f62898cca4682b17f8e8e07
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 12 17:35:25 2021 +0100

    libstdc++: Add additional overload of std::lerp [PR101870]
    
    The [cmath.syn] p1 wording about additional overloads sufficient to
    handle any arithmetic types also applies to std::lerp. This adds a new
    overload of std::lerp that does the required promotions to support
    arguments of arbitrary arithmetic types.
    
    A new __promoted_t alias template is added, which the C++17 function
    templates std::hypot and std::lerp can use to avoid instantiating the
    __promote_3 class template.
    
    Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/101870
            * include/c_global/cmath (hypot): Use __promoted_t.
            (lerp): Add new overload accepting any arithmetic types.
            * include/ext/type_traits.h (__promoted_t): New alias template.
            * testsuite/26_numerics/lerp.cc: Moved to...
            * testsuite/26_numerics/lerp/1.cc: ...here.
            * testsuite/26_numerics/lerp/constexpr.cc: New test.
            * testsuite/26_numerics/lerp/version.cc: New test.
Comment 2 Jonathan Wakely 2021-08-12 18:52:42 UTC
Fixed on trunk but I plan to backport it as well.
Comment 3 GCC Commits 2021-10-12 10:59:34 UTC
The releases/gcc-11 branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:371e12a7fd0295251340eabae77dd060577054c3

commit r11-9113-g371e12a7fd0295251340eabae77dd060577054c3
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 12 17:35:25 2021 +0100

    libstdc++: Add additional overload of std::lerp [PR101870]
    
    The [cmath.syn] p1 wording about additional overloads sufficient to
    handle any arithmetic types also applies to std::lerp. This adds a new
    overload of std::lerp that does the required promotions to support
    arguments of arbitrary arithmetic types.
    
    A new __promoted_t alias template is added, which the C++17 function
    templates std::hypot and std::lerp can use to avoid instantiating the
    __promote_3 class template.
    
    Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/101870
            * include/c_global/cmath (hypot): Use __promoted_t.
            (lerp): Add new overload accepting any arithmetic types.
            * include/ext/type_traits.h (__promoted_t): New alias template.
            * testsuite/26_numerics/lerp.cc: Moved to...
            * testsuite/26_numerics/lerp/1.cc: ...here.
            * testsuite/26_numerics/lerp/constexpr.cc: New test.
            * testsuite/26_numerics/lerp/version.cc: New test.
    
    (cherry picked from commit 9017326e19fe278d5f62898cca4682b17f8e8e07)
Comment 4 Jonathan Wakely 2021-10-12 11:21:44 UTC
Fixed for 11.3
Comment 5 GCC Commits 2021-11-26 15:40:59 UTC
The releases/gcc-10 branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

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

commit r10-10301-ga2139a9a95e624f99f470191335495d02254e1f1
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 12 17:35:25 2021 +0100

    libstdc++: Add additional overload of std::lerp [PR101870]
    
    The [cmath.syn] p1 wording about additional overloads sufficient to
    handle any arithmetic types also applies to std::lerp. This adds a new
    overload of std::lerp that does the required promotions to support
    arguments of arbitrary arithmetic types.
    
    A new __promoted_t alias template is added, which the C++17 function
    templates std::hypot and std::lerp can use to avoid instantiating the
    __promote_3 class template.
    
    Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/101870
            * include/c_global/cmath (hypot): Use __promoted_t.
            (lerp): Add new overload accepting any arithmetic types.
            * include/ext/type_traits.h (__promoted_t): New alias template.
            * testsuite/26_numerics/lerp.cc: Moved to...
            * testsuite/26_numerics/lerp/1.cc: ...here.
            * testsuite/26_numerics/lerp/constexpr.cc: New test.
            * testsuite/26_numerics/lerp/version.cc: New test.
    
    (cherry picked from commit 9017326e19fe278d5f62898cca4682b17f8e8e07)
Comment 6 Jonathan Wakely 2021-11-26 15:45:21 UTC
Also fixed for 10.4
Comment 7 GCC Commits 2022-05-09 16:40:16 UTC
The releases/gcc-9 branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:5ed333b0762d847ffb0096ba97e924188c766d69

commit r9-10059-g5ed333b0762d847ffb0096ba97e924188c766d69
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 12 17:35:25 2021 +0100

    libstdc++: Add additional overload of std::lerp [PR101870]
    
    The [cmath.syn] p1 wording about additional overloads sufficient to
    handle any arithmetic types also applies to std::lerp. This adds a new
    overload of std::lerp that does the required promotions to support
    arguments of arbitrary arithmetic types.
    
    A new __promoted_t alias template is added, which the C++17 function
    templates std::hypot and std::lerp can use to avoid instantiating the
    __promote_3 class template.
    
    Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/101870
            * include/c_global/cmath (hypot): Use __promoted_t.
            (lerp): Add new overload accepting any arithmetic types.
            * include/ext/type_traits.h (__promoted_t): New alias template.
            * testsuite/26_numerics/lerp.cc: Moved to...
            * testsuite/26_numerics/lerp/1.cc: ...here.
            * testsuite/26_numerics/lerp/constexpr.cc: New test.
            * testsuite/26_numerics/lerp/version.cc: New test.
    
    (cherry picked from commit 9017326e19fe278d5f62898cca4682b17f8e8e07)
Comment 8 Jonathan Wakely 2022-05-09 16:51:05 UTC
Fixed for 9.5 now too.