On Tue, Jul 15, 2025 at 10:36 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> Define a fallback implementation of the __promoted_t alias for
> hypothetical C++17 compilers which don't define __cpp_fold_expressions.
> Without this, <cmath> can't be compiled by such compilers, because the
> 3-arg form of std::hypot uses the alias.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/121097
>         * include/ext/type_traits.h (__promoted_t): Define fallback
>         implementation for the 3-arg case that std::hypot uses.
> ---
>
> I tested this by bodging the header so that this definition is used
> unconditionally, and it seemed to work.
>
I do not understand why we are defining the promote_t alias, instead
of just changing the std::hypot to use __promoted_3, that is provided
also in case when __promoted is defined. Like fma does.

>
>  libstdc++-v3/include/ext/type_traits.h | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/libstdc++-v3/include/ext/type_traits.h
> b/libstdc++-v3/include/ext/type_traits.h
> index 061555231468..ca5bc4e0d23e 100644
> --- a/libstdc++-v3/include/ext/type_traits.h
> +++ b/libstdc++-v3/include/ext/type_traits.h
> @@ -269,6 +269,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      {
>        typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type;
>      };
> +
> +#ifdef __glibcxx_hypot // C++ >= 17 && HOSTED
> +  // __promoted_t is needed by the 3-arg std::hypot so define this in case
> +  // any C++17 compiler doesn't define __cpp_fold_expressions (PR 121097).
> +  template<typename _Tp1, typename _Tp2, typename _Tp3>
> +    using __promoted_t = typename __promote_3<_Tp1, _Tp2, _Tp3>::__type;
> +#endif
> +
>  #endif
>
>  _GLIBCXX_END_NAMESPACE_VERSION
> --
> 2.50.1
>
>

Reply via email to