https://gcc.gnu.org/g:0564d9501ebf11c9f0c541ac79054a38ec791d8c
commit r15-3868-g0564d9501ebf11c9f0c541ac79054a38ec791d8c Author: Jakub Jelinek <ja...@redhat.com> Date: Wed Sep 25 16:07:50 2024 +0200 c++: Add testcase for DR 2836 Seems we already handle it the way the DR clarifies, if double/long double and std::float64_t have the same mode, foo has long double type (while x + y would be _Float64 in C23), so this patch just adds a testcase which verifies that. 2024-09-25 Jakub Jelinek <ja...@redhat.com> * g++.dg/DRs/dr2836.C: New test. Diff: --- gcc/testsuite/g++.dg/DRs/dr2836.C | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/gcc/testsuite/g++.dg/DRs/dr2836.C b/gcc/testsuite/g++.dg/DRs/dr2836.C new file mode 100644 index 000000000000..88e35a7f3052 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr2836.C @@ -0,0 +1,30 @@ +// DR 2836 - Conversion rank of long double and extended floating-point types +// { dg-do compile { target c++23 } } +// { dg-additional-options "-mlong-double-64" { target powerpc*-*-* s390*-*-* } } + +#include <stdfloat> + +#if defined (__STDCPP_FLOAT64_T__) \ + && __LDBL_MAX_EXP__ == __FLT64_MAX_EXP__ \ + && __LDBL_MANT_DIG__ == __FLT64_MANT_DIG__ \ + && __DBL_MAX_EXP__ == __FLT64_MAX_EXP__ \ + && __DBL_MANT_DIG__ == __FLT64_MANT_DIG__ +auto +foo (long double x, std::float64_t y) +{ + return x + y; +} + +template<typename T, T v> struct integral_constant { + static constexpr T value = v; +}; +typedef integral_constant<bool, false> false_type; +typedef integral_constant<bool, true> true_type; +template<class T, class U> +struct is_same : false_type {}; +template <class T> +struct is_same<T, T> : true_type {}; + +static_assert (is_same <decltype (foo (1.0L, 1.0F64)), long double>::value); + +#endif