// P1467R9 - Extended floating-point types and standard names. // { dg-do compile { target c++23 } } // { dg-options "" } #include "ext-floating.h" #ifdef __STRICT_ANSI__ #undef __SIZEOF_FLOAT128__ #endif using namespace std; static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); #ifdef __SIZEOF_FLOAT128__ static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __STDCPP_FLOAT16_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __STDCPP_FLOAT32_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __STDCPP_FLOAT64_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __STDCPP_FLOAT128_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #ifdef __SIZEOF_FLOAT128__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #endif #ifdef __STDCPP_BFLOAT16_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __FLT32X_MANT_DIG__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #ifdef __STDCPP_FLOAT16_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT32_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT64_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT128_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #endif #ifdef __FLT64X_MANT_DIG__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #ifdef __STDCPP_FLOAT16_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT32_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT64_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT128_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __SIZEOF_FLOAT128__ static_assert (!is_same<_Float64x, __float128>::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #endif #ifdef __FLT128X_MANT_DIG__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #ifdef __STDCPP_FLOAT16_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT32_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT64_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __STDCPP_FLOAT128_T__ static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #ifdef __SIZEOF_FLOAT128__ static_assert (!is_same<_Float128x, __float128>::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); static_assert (!is_same::value); #endif #endif static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); static_assert (is_same::value); #if defined(__STDCPP_FLOAT16_T__) && defined(__STDCPP_FLOAT32_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT16_T__) && defined(__STDCPP_FLOAT64_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT16_T__) && defined(__STDCPP_FLOAT128_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT16_T__) && defined(__FLT32X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT16_T__) && defined(__FLT64X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT16_T__) && defined(__FLT128X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT32_T__) && defined(__STDCPP_FLOAT64_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT32_T__) && defined(__STDCPP_FLOAT128_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT32_T__) && defined(__FLT32X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT32_T__) && defined(__FLT64X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT32_T__) && defined(__FLT128X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT64_T__) && defined(__STDCPP_FLOAT128_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT64_T__) && defined(__FLT32X_MANT_DIG__) \ && __FLT64_MAX_EXP__ == __FLT32X_MAX_EXP__ \ && __FLT64_MANT_DIG__ == __FLT32X_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT64_T__) && defined(__FLT64X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT64_T__) && defined(__FLT128X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT128_T__) && defined(__FLT32X_MANT_DIG__) \ && __FLT128_MAX_EXP__ >= __FLT32X_MAX_EXP__ \ && __FLT128_MANT_DIG__ >= __FLT32X_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT128_T__) && defined(__FLT64X_MANT_DIG__) \ && __FLT128_MAX_EXP__ >= __FLT64X_MAX_EXP__ \ && __FLT128_MANT_DIG__ >= __FLT64X_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_FLOAT128_T__) && defined(__FLT128X_MANT_DIG__) static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_BFLOAT16_T__) && defined(__STDCPP_FLOAT32_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_BFLOAT16_T__) && defined(__STDCPP_FLOAT64_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #if defined(__STDCPP_BFLOAT16_T__) && defined(__STDCPP_FLOAT128_T__) static_assert (!is_same::value); static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __STDCPP_FLOAT16_T__ #if __FLT_MAX_EXP__ > __FLT16_MAX_EXP__ && __FLT_MANT_DIG__ > __FLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __DBL_MAX_EXP__ > __FLT16_MAX_EXP__ && __DBL_MANT_DIG__ > __FLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ > __FLT16_MAX_EXP__ && __LDBL_MANT_DIG__ > __FLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #endif #ifdef __STDCPP_FLOAT32_T__ #if __FLT_MAX_EXP__ == __FLT32_MAX_EXP__ && __FLT_MANT_DIG__ == __FLT32_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __DBL_MAX_EXP__ > __FLT32_MAX_EXP__ && __DBL_MANT_DIG__ > __FLT32_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ > __FLT32_MAX_EXP__ && __LDBL_MANT_DIG__ > __FLT32_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #endif #ifdef __STDCPP_FLOAT64_T__ #if __FLT_MAX_EXP__ < __FLT64_MAX_EXP__ && __FLT_MANT_DIG__ < __FLT64_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __DBL_MAX_EXP__ == __FLT64_MAX_EXP__ && __DBL_MANT_DIG__ == __FLT64_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ > __FLT64_MAX_EXP__ && __LDBL_MANT_DIG__ > __FLT64_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ == __FLT64_MAX_EXP__ && __LDBL_MANT_DIG__ == __FLT64_MANT_DIG__ \ && __DBL_MAX_EXP__ == __FLT64_MAX_EXP__ && __DBL_MANT_DIG__ == __FLT64_MANT_DIG__ // An extended floating-point type with the same set of values as more than one // cv-unqualified standard floating-point type has a rank equal to the rank of // double. // Then long double will have higher rank than float64_t. static_assert (is_same::value); static_assert (is_same::value); #endif #endif #ifdef __STDCPP_FLOAT128_T__ #if __FLT_MAX_EXP__ < __FLT128_MAX_EXP__ && __FLT_MANT_DIG__ < __FLT128_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __DBL_MAX_EXP__ < __FLT128_MAX_EXP__ && __DBL_MANT_DIG__ < __FLT128_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ <= __FLT128_MAX_EXP__ && __LDBL_MANT_DIG__ <= __FLT128_MANT_DIG__ \ && __LDBL_MANT_DIG__ != 106 // IBM extended long double and IEEE quad are unordered. static_assert (is_same::value); static_assert (is_same::value); #endif #ifdef __SIZEOF_FLOAT128__ static_assert (is_same::value); static_assert (is_same::value); #endif #endif #ifdef __STDCPP_BFLOAT16_T__ #if __FLT_MAX_EXP__ > __BFLT16_MAX_EXP__ && __FLT_MANT_DIG__ > __BFLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __DBL_MAX_EXP__ > __BFLT16_MAX_EXP__ && __DBL_MANT_DIG__ > __BFLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #if __LDBL_MAX_EXP__ > __BFLT16_MAX_EXP__ && __LDBL_MANT_DIG__ > __BFLT16_MANT_DIG__ static_assert (is_same::value); static_assert (is_same::value); #endif #endif void foo (float) {} void foo (double) {} void foo (long double) {} #ifdef __STDCPP_FLOAT16_T__ void foo (float16_t) {} #endif #ifdef __STDCPP_FLOAT32_T__ void foo (float32_t) {} #endif #ifdef __STDCPP_FLOAT64_T__ void foo (float64_t) {} #endif #ifdef __STDCPP_FLOAT128_T__ void foo (float128_t) {} #endif #ifdef __STDCPP_BFLOAT16_T__ void foo (bfloat16_t) {} #endif #ifdef __FLT32X_MANT_DIG__ void foo (_Float32x) {} #endif #ifdef __FLT64X_MANT_DIG__ void foo (_Float64x) {} #endif #ifdef __FLT128X_MANT_DIG__ void foo (_Float128x) {} #endif