diff options
author | Joseph Myers <joseph@codesourcery.com> | 2020-11-17 00:25:12 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2020-11-17 00:25:12 +0000 |
commit | 3cfe746fc5255f8dd1674bf4a8873b7b8e178c89 (patch) | |
tree | f0d2a626b8a10362ae2d8a09ba7ed66879fbf81b /gcc | |
parent | 29c5d9ceb9bf7416b6f6b976879ac0dc60701904 (diff) | |
download | gcc-3cfe746fc5255f8dd1674bf4a8873b7b8e178c89.zip gcc-3cfe746fc5255f8dd1674bf4a8873b7b8e178c89.tar.gz gcc-3cfe746fc5255f8dd1674bf4a8873b7b8e178c89.tar.bz2 |
float.h: C2x NaN and Inf macros
C2x adds macros for NaNs and infinities to <float.h>, some of them
previously in <math.h> (and some still in <math.h> as well in C2x as
an obsolescent feature). Add these macros to GCC's <float.h>
implementation.
This omits the macros for DFP signaling NaNs, leaving those to be
added in a separate patch. However, it includes the _FloatN /
_FloatNx macros (conditional on __STDC_WANT_IEC_60559_TYPES_EXT__) in
the current draft version of the integration of TS 18661-3 into C2x as
an Annex.
As GCC allows duplicate macro definitions with different expansions in
system headers, it should be OK if <math.h> defines INFINITY or NAN
with a slightly different expansion (e.g. different choice of whether
there is whitespace between tokens); tests are added including
<float.h> and <math.h> in either order. Because <float.h> uses #undef
on all macros before defining them, even with -Wsystem-headers there
could only ever be issues when <math.h> is included after <float.h>.
Bootstrapped with no regressions on x86_64-pc-linux-gnu.
gcc/
2020-11-17 Joseph Myers <joseph@codesourcery.com>
* ginclude/float.h (INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN)
(FLT16_SNAN, FLT32_SNAN, FLT64_SNAN, FLT128_SNAN, FLT32X_SNAN)
(FLT64X_SNAN, FLT128X_SNAN, DEC_INFINITY, DEC_NAN): New C2x
macros.
* doc/sourcebuild.texi (Effective-Target Keywords): Document inff.
gcc/testsuite/
2020-11-17 Joseph Myers <joseph@codesourcery.com>
* lib/target-supports.exp (check_effective_target_inff): New.
* gcc.dg/c11-float-4.c, gcc.dg/c11-float-5.c,
gcc.dg/c11-float-dfp-2.c, gcc.dg/c2x-float-2.c,
gcc.dg/c2x-float-3.c, gcc.dg/c2x-float-4.c, gcc.dg/c2x-float-5.c,
gcc.dg/c2x-float-6.c, gcc.dg/c2x-float-7.c, gcc.dg/c2x-float-8.c,
gcc.dg/c2x-float-9.c, gcc.dg/c2x-float-no-dfp-3.c,
gcc.dg/c2x-float-no-dfp-4.c, gcc.dg/dfp/c2x-float-dfp-4.c,
gcc.dg/dfp/c2x-float-dfp-5.c, gcc.dg/dfp/c2x-float-dfp-6.c,
gcc.dg/torture/float128-nan-floath.c,
gcc.dg/torture/float128x-nan-floath.c,
gcc.dg/torture/float16-nan-floath.c,
gcc.dg/torture/float32-nan-floath.c,
gcc.dg/torture/float32x-nan-floath.c,
gcc.dg/torture/float64-nan-floath.c,
gcc.dg/torture/float64x-nan-floath.c,
gcc.dg/torture/floatn-nan-floath.h: New tests.
Diffstat (limited to 'gcc')
27 files changed, 585 insertions, 0 deletions
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 4822efe..566fda0 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1443,6 +1443,10 @@ Target has runtime support for any options added with @item inf Target supports floating point infinite (@code{inf}) for type @code{double}. + +@item inff +Target supports floating point infinite (@code{inf}) for type +@code{float}. @end table @subsubsection Fortran-specific attributes diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h index 9c4b038..7744699 100644 --- a/gcc/ginclude/float.h +++ b/gcc/ginclude/float.h @@ -248,6 +248,32 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define DBL_NORM_MAX __DBL_NORM_MAX__ #define LDBL_NORM_MAX __LDBL_NORM_MAX__ +/* Infinity in type float, or overflow if infinity not supported. */ +#undef INFINITY +#define INFINITY (__builtin_inff ()) + +/* Quiet NaN, if supported for float. */ +#if __FLT_HAS_QUIET_NAN__ +#undef NAN +#define NAN (__builtin_nanf ("")) +#endif + +/* Signaling NaN, if supported for each type. All formats supported + by GCC support either both quiet and signaling NaNs, or neither + kind of NaN. */ +#if __FLT_HAS_QUIET_NAN__ +#undef FLT_SNAN +#define FLT_SNAN (__builtin_nansf ("")) +#endif +#if __DBL_HAS_QUIET_NAN__ +#undef DBL_SNAN +#define DBL_SNAN (__builtin_nans ("")) +#endif +#if __LDBL_HAS_QUIET_NAN__ +#undef LDBL_SNAN +#define LDBL_SNAN (__builtin_nansl ("")) +#endif + #endif /* C2X */ #ifdef __STDC_WANT_IEC_60559_BFP_EXT__ @@ -284,6 +310,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__ #undef FLT16_TRUE_MIN #define FLT16_TRUE_MIN __FLT16_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT16_SNAN +#define FLT16_SNAN (__builtin_nansf16 ("")) +#endif /* C2X */ #endif /* __FLT16_MANT_DIG__. */ #ifdef __FLT32_MANT_DIG__ @@ -309,6 +339,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT32_DECIMAL_DIG __FLT32_DECIMAL_DIG__ #undef FLT32_TRUE_MIN #define FLT32_TRUE_MIN __FLT32_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT32_SNAN +#define FLT32_SNAN (__builtin_nansf32 ("")) +#endif /* C2X */ #endif /* __FLT32_MANT_DIG__. */ #ifdef __FLT64_MANT_DIG__ @@ -334,6 +368,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT64_DECIMAL_DIG __FLT64_DECIMAL_DIG__ #undef FLT64_TRUE_MIN #define FLT64_TRUE_MIN __FLT64_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT64_SNAN +#define FLT64_SNAN (__builtin_nansf64 ("")) +#endif /* C2X */ #endif /* __FLT64_MANT_DIG__. */ #ifdef __FLT128_MANT_DIG__ @@ -359,6 +397,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT128_DECIMAL_DIG __FLT128_DECIMAL_DIG__ #undef FLT128_TRUE_MIN #define FLT128_TRUE_MIN __FLT128_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT128_SNAN +#define FLT128_SNAN (__builtin_nansf128 ("")) +#endif /* C2X */ #endif /* __FLT128_MANT_DIG__. */ #ifdef __FLT32X_MANT_DIG__ @@ -384,6 +426,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT32X_DECIMAL_DIG __FLT32X_DECIMAL_DIG__ #undef FLT32X_TRUE_MIN #define FLT32X_TRUE_MIN __FLT32X_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT32X_SNAN +#define FLT32X_SNAN (__builtin_nansf32x ("")) +#endif /* C2X */ #endif /* __FLT32X_MANT_DIG__. */ #ifdef __FLT64X_MANT_DIG__ @@ -409,6 +455,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT64X_DECIMAL_DIG __FLT64X_DECIMAL_DIG__ #undef FLT64X_TRUE_MIN #define FLT64X_TRUE_MIN __FLT64X_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT64X_SNAN +#define FLT64X_SNAN (__builtin_nansf64x ("")) +#endif /* C2X */ #endif /* __FLT64X_MANT_DIG__. */ #ifdef __FLT128X_MANT_DIG__ @@ -434,6 +484,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define FLT128X_DECIMAL_DIG __FLT128X_DECIMAL_DIG__ #undef FLT128X_TRUE_MIN #define FLT128X_TRUE_MIN __FLT128X_DENORM_MIN__ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#undef FLT128X_SNAN +#define FLT128X_SNAN (__builtin_nansf128x ("")) +#endif /* C2X */ #endif /* __FLT128X_MANT_DIG__. */ #endif /* __STDC_WANT_IEC_60559_TYPES_EXT__. */ @@ -537,6 +591,18 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif /* __STDC_WANT_IEC_60559_DFP_EXT__ || C2X. */ +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L + +/* Infinity in type _Decimal32. */ +#undef DEC_INFINITY +#define DEC_INFINITY (__builtin_infd32 ()) + +/* Quiet NaN in type _Decimal32. */ +#undef DEC_NAN +#define DEC_NAN (__builtin_nand32 ("")) + +#endif /* C2X */ + #endif /* __DEC32_MANT_DIG__ */ #endif /* _FLOAT_H___ */ diff --git a/gcc/testsuite/gcc.dg/c11-float-4.c b/gcc/testsuite/gcc.dg/c11-float-4.c new file mode 100644 index 0000000..ceac6ef --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-float-4.c @@ -0,0 +1,25 @@ +/* Test infinity and NaN macros not defined for C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +#include <float.h> + +#ifdef INFINITY +#error "INFINITY defined" +#endif + +#ifdef NAN +#error "NAN defined" +#endif + +#ifdef FLT_SNAN +#error "FLT_SNAN defined" +#endif + +#ifdef DBL_SNAN +#error "DBL_SNAN defined" +#endif + +#ifdef LDBL_SNAN +#error "LDBL_SNAN defined" +#endif diff --git a/gcc/testsuite/gcc.dg/c11-float-5.c b/gcc/testsuite/gcc.dg/c11-float-5.c new file mode 100644 index 0000000..bb48695 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-float-5.c @@ -0,0 +1,35 @@ +/* Test sNaN macros for _FloatN and _FloatNx not defined for C11 with + __STDC_WANT_IEC_60559_TYPES_EXT__. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +#define __STDC_WANT_IEC_60559_TYPES_EXT__ +#include <float.h> + +#ifdef FLT16_SNAN +#error "FLT16_SNAN defined" +#endif + +#ifdef FLT32_SNAN +#error "FLT32_SNAN defined" +#endif + +#ifdef FLT64_SNAN +#error "FLT64_SNAN defined" +#endif + +#ifdef FLT128_SNAN +#error "FLT128_SNAN defined" +#endif + +#ifdef FLT32X_SNAN +#error "FLT32X_SNAN defined" +#endif + +#ifdef FLT64X_SNAN +#error "FLT64X_SNAN defined" +#endif + +#ifdef FLT128X_SNAN +#error "FLT128X_SNAN defined" +#endif diff --git a/gcc/testsuite/gcc.dg/c11-float-dfp-2.c b/gcc/testsuite/gcc.dg/c11-float-dfp-2.c new file mode 100644 index 0000000..e63ebbc --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-float-dfp-2.c @@ -0,0 +1,6 @@ +/* Test DFP macros not defined in <float.h> for C11. Infinity and NaN + macros. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11" } */ + +#include "c2x-float-no-dfp-3.c" diff --git a/gcc/testsuite/gcc.dg/c2x-float-2.c b/gcc/testsuite/gcc.dg/c2x-float-2.c new file mode 100644 index 0000000..4f669fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-2.c @@ -0,0 +1,23 @@ +/* Test INFINITY macro. Generic test even if infinities not + supported. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -w" } */ +/* { dg-add-options ieee } */ + +#include <float.h> + +#ifndef INFINITY +#error "INFINITY undefined" +#endif + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (INFINITY, float : 0); + if (!(INFINITY >= FLT_MAX)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-3.c b/gcc/testsuite/gcc.dg/c2x-float-3.c new file mode 100644 index 0000000..7c6298b --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-3.c @@ -0,0 +1,27 @@ +/* Test INFINITY macro. Test when infinities supported. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target inff } */ + +#include <float.h> + +#ifndef INFINITY +#error "INFINITY undefined" +#endif + +volatile float f = INFINITY; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (INFINITY, float : 0); + if (!(INFINITY > FLT_MAX)) + abort (); + if (!(f > FLT_MAX)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-4.c b/gcc/testsuite/gcc.dg/c2x-float-4.c new file mode 100644 index 0000000..bca8435 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-4.c @@ -0,0 +1,33 @@ +/* Test NAN macro. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ +/* { dg-add-options ieee } */ + +#include <float.h> + +/* This should be defined if and only if quiet NaNs are supported for + type float. If the testsuite gains effective-target support for + targets not supporting NaNs, or not supporting them for all types, + this test should be split into versions for targets with and + without NaNs for float. */ +#ifndef NAN +#error "NAN undefined" +#endif + +volatile float f = NAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (NAN, float : 0); + if (!__builtin_isnan (NAN)) + abort (); + if (!__builtin_isnan (f)) + abort (); + if (!__builtin_isnan (f + f)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-5.c b/gcc/testsuite/gcc.dg/c2x-float-5.c new file mode 100644 index 0000000..477f9cf --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-5.c @@ -0,0 +1,32 @@ +/* Test NAN macro. Runtime exceptions test, to verify NaN is quiet + not signaling. */ +/* { dg-do run } */ +/* { dg-require-effective-target fenv_exceptions } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ +/* { dg-add-options ieee } */ + +#include <fenv.h> +#include <float.h> + +/* This should be defined if and only if quiet NaNs are supported for + type float. If the testsuite gains effective-target support for + targets not supporting NaNs, or not supporting them for all types, + this test should only be run for targets supporting quiet NaNs for + float. */ +#ifndef NAN +#error "NAN undefined" +#endif + +volatile float f = NAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + f += f; + if (fetestexcept (FE_INVALID)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-6.c b/gcc/testsuite/gcc.dg/c2x-float-6.c new file mode 100644 index 0000000..573540b --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-6.c @@ -0,0 +1,49 @@ +/* Test SNAN macros. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */ +/* { dg-add-options ieee } */ + +#include <float.h> + +/* These should be defined if and only if signaling NaNs are supported + for the given types. If the testsuite gains effective-target + support for targets not supporting signaling NaNs, or not + supporting them for all types, this test should be made + appropriately conditional. */ +#ifndef FLT_SNAN +#error "FLT_SNAN undefined" +#endif +#ifndef DBL_SNAN +#error "DBL_SNAN undefined" +#endif +#ifndef LDBL_SNAN +#error "LDBL_SNAN undefined" +#endif + +volatile float f = FLT_SNAN; +volatile double d = DBL_SNAN; +volatile long double ld = LDBL_SNAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (FLT_SNAN, float : 0); + (void) _Generic (DBL_SNAN, double : 0); + (void) _Generic (LDBL_SNAN, long double : 0); + if (!__builtin_isnan (FLT_SNAN)) + abort (); + if (!__builtin_isnan (f)) + abort (); + if (!__builtin_isnan (DBL_SNAN)) + abort (); + if (!__builtin_isnan (d)) + abort (); + if (!__builtin_isnan (LDBL_SNAN)) + abort (); + if (!__builtin_isnan (ld)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-7.c b/gcc/testsuite/gcc.dg/c2x-float-7.c new file mode 100644 index 0000000..0c90ff2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-7.c @@ -0,0 +1,49 @@ +/* Test SNAN macros. Runtime exceptions test, to verify NaN is + signaling. */ +/* { dg-do run } */ +/* { dg-require-effective-target fenv_exceptions } */ +/* { dg-options "-std=c2x -pedantic-errors -fsignaling-nans" } */ +/* { dg-add-options ieee } */ + +#include <fenv.h> +#include <float.h> + +/* These should be defined if and only if signaling NaNs are supported + for the given types. If the testsuite gains effective-target + support for targets not supporting signaling NaNs, or not + supporting them for all types, this test should be made + appropriately conditional. */ +#ifndef FLT_SNAN +#error "FLT_SNAN undefined" +#endif +#ifndef DBL_SNAN +#error "DBL_SNAN undefined" +#endif +#ifndef LDBL_SNAN +#error "LDBL_SNAN undefined" +#endif + +volatile float f = FLT_SNAN; +volatile double d = DBL_SNAN; +volatile long double ld = LDBL_SNAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + feclearexcept (FE_ALL_EXCEPT); + f += f; + if (!fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d += d; + if (!fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + ld += ld; + if (!fetestexcept (FE_INVALID)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/c2x-float-8.c b/gcc/testsuite/gcc.dg/c2x-float-8.c new file mode 100644 index 0000000..b10cb85 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-8.c @@ -0,0 +1,7 @@ +/* Test including <math.h> then <float.h> does not result in errors + from duplicate NAN and INFINITY macros. */ +/* { dg-do compile } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ + +#include <math.h> +#include <float.h> diff --git a/gcc/testsuite/gcc.dg/c2x-float-9.c b/gcc/testsuite/gcc.dg/c2x-float-9.c new file mode 100644 index 0000000..0a54bc2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-9.c @@ -0,0 +1,7 @@ +/* Test including <float.h> then <math.h> does not result in errors + from duplicate NAN and INFINITY macros. */ +/* { dg-do compile } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ + +#include <float.h> +#include <math.h> diff --git a/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c new file mode 100644 index 0000000..d8a239c --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c @@ -0,0 +1,14 @@ +/* Test DFP macros not defined in <float.h> if no DFP support. + Infinity and NaN macros. */ +/* { dg-do compile { target { ! dfp } } } */ +/* { dg-options "-std=c2x" } */ + +#include <float.h> + +#ifdef DEC_INFINITY +# error "DEC_INFINITY defined" +#endif + +#ifdef DEC_NAN +# error "DEC_NAN defined" +#endif diff --git a/gcc/testsuite/gcc.dg/c2x-float-no-dfp-4.c b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-4.c new file mode 100644 index 0000000..855922a --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-4.c @@ -0,0 +1,10 @@ +/* Test DFP macros not defined in <float.h> if no DFP support. + Infinity and NaN macros. Test with feature test macros + defined. */ +/* { dg-do compile { target { ! dfp } } } */ +/* { dg-options "-std=c2x" } */ + +#define __STDC_WANT_DEC_FP__ +#define __STDC_WANT_IEC_60559_DFP_EXT__ + +#include "c2x-float-no-dfp-3.c" diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-4.c b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-4.c new file mode 100644 index 0000000..58ee74d --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-4.c @@ -0,0 +1,25 @@ +/* Test DEC_INFINITY defined in <float.h> with DFP support. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x" } */ + +#include <float.h> + +#ifndef DEC_INFINITY +# error "DEC_INFINITY not defined" +#endif + +volatile _Decimal32 d = DEC_INFINITY; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (DEC_INFINITY, _Decimal32 : 0); + if (!(DEC_INFINITY > DEC32_MAX)) + abort (); + if (!(d > DEC32_MAX)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-5.c b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-5.c new file mode 100644 index 0000000..8d09725 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-5.c @@ -0,0 +1,25 @@ +/* Test DEC_NAN defined in <float.h> with DFP support. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x" } */ + +#include <float.h> + +#ifndef DEC_NAN +# error "DEC_NAN not defined" +#endif + +volatile _Decimal32 d = DEC_NAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (DEC_NAN, _Decimal32 : 0); + if (!__builtin_isnan (DEC_NAN)) + abort (); + if (!__builtin_isnan (d)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-6.c b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-6.c new file mode 100644 index 0000000..4533c61 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-6.c @@ -0,0 +1,28 @@ +/* Test DEC_NAN macro. Runtime exceptions test, to verify NaN is + quiet not signaling. (This would only actually fail for a + signaling NaN in the hardware DFP case, because the software DFP + support in libgcc does not integrate with hardware exceptions.) */ +/* { dg-do run } */ +/* { dg-require-effective-target fenv_exceptions } */ +/* { dg-options "-std=c2x" } */ + +#include <fenv.h> +#include <float.h> + +#ifndef DEC_NAN +# error "DEC_NAN not defined" +#endif + +volatile _Decimal32 d = DEC_NAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + d += d; + if (fetestexcept (FE_INVALID)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/torture/float128-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float128-nan-floath.c new file mode 100644 index 0000000..69fd45a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float128-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float128 NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float128 } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float128_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 128 +#define EXT 0 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float128x-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float128x-nan-floath.c new file mode 100644 index 0000000..5be4c07 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float128x-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float128x NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float128x } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float128x_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 128 +#define EXT 1 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float16-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float16-nan-floath.c new file mode 100644 index 0000000..cf03b45 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float16-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float16 NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float16 } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float16_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 16 +#define EXT 0 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float32-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float32-nan-floath.c new file mode 100644 index 0000000..2976a40 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float32-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float32 NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float32 } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float32_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 32 +#define EXT 0 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float32x-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float32x-nan-floath.c new file mode 100644 index 0000000..0aab4be --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float32x-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float32x NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float32x } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float32x_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 32 +#define EXT 1 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float64-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float64-nan-floath.c new file mode 100644 index 0000000..1f5298b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float64-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float64 NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float64 } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float64_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 64 +#define EXT 0 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/float64x-nan-floath.c b/gcc/testsuite/gcc.dg/torture/float64x-nan-floath.c new file mode 100644 index 0000000..fbc8676 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/float64x-nan-floath.c @@ -0,0 +1,11 @@ +/* Test _Float64x NaNs in <float.h>. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x -fsignaling-nans" } */ +/* { dg-add-options float64x } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target float64x_runtime } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#define WIDTH 64 +#define EXT 1 +#include "floatn-nan-floath.h" diff --git a/gcc/testsuite/gcc.dg/torture/floatn-nan-floath.h b/gcc/testsuite/gcc.dg/torture/floatn-nan-floath.h new file mode 100644 index 0000000..9892fd0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/floatn-nan-floath.h @@ -0,0 +1,36 @@ +/* Tests for _FloatN / _FloatNx types: compile and execution tests for + NaNs, SNAN macros in <float.h>. Before including this file, define + WIDTH as the value N; define EXT to 1 for _FloatNx and 0 for + _FloatN. */ + +#define CONCATX(X, Y) X ## Y +#define CONCAT(X, Y) CONCATX (X, Y) +#define CONCAT3(X, Y, Z) CONCAT (CONCAT (X, Y), Z) +#define CONCAT4(W, X, Y, Z) CONCAT (CONCAT (CONCAT (W, X), Y), Z) + +#if EXT +# define TYPE CONCAT3 (_Float, WIDTH, x) +# define SNAN CONCAT3 (FLT, WIDTH, X_SNAN) +#else +# define TYPE CONCAT (_Float, WIDTH) +# define SNAN CONCAT3 (FLT, WIDTH, _SNAN) +#endif + +#define __STDC_WANT_IEC_60559_TYPES_EXT__ +#include <fenv.h> +#include <float.h> + +extern void exit (int); +extern void abort (void); + +volatile TYPE nans_cst = SNAN; + +int +main (void) +{ + volatile TYPE r; + r = nans_cst + nans_cst; + if (!fetestexcept (FE_INVALID)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index ceee78c..22acda2 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -10351,6 +10351,13 @@ proc check_effective_target_inf { } { }] } +# Return 1 if target supports floating point "infinite" for float. +proc check_effective_target_inff { } { + return [check_no_compiler_messages supports_inff assembly { + const float pinf = __builtin_inff (); + }] +} + # Return 1 if the target supports ARMv8.3 Adv.SIMD Complex instructions # instructions, 0 otherwise. The test is valid for ARM and for AArch64. # Record the command line options needed. |