diff options
-rw-r--r-- | gcc/testsuite/g++.dg/DRs/dr2836.C | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/DRs/dr2836.C b/gcc/testsuite/g++.dg/DRs/dr2836.C new file mode 100644 index 0000000..88e35a7 --- /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 |