aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2022-01-02 11:36:23 +0100
committerFrancois-Xavier Coudert <fxcoudert@gmail.com>2022-01-10 12:28:46 +0100
commit492954263e39346287a5a2a32bcc5312466a0ee1 (patch)
tree839dd37ee7e5d1ef72ae09a908ddb9bf55035282 /gcc
parentbe59671c5624fe8bf21ddb0192e97ebdfa4db381 (diff)
downloadgcc-492954263e39346287a5a2a32bcc5312466a0ee1.zip
gcc-492954263e39346287a5a2a32bcc5312466a0ee1.tar.gz
gcc-492954263e39346287a5a2a32bcc5312466a0ee1.tar.bz2
Fortran: Allow IEEE_CLASS to identify signaling NaNs
We use the issignaling macro, present in some libc's (notably glibc), when it is available. Compile all IEEE-related files in the library (both C and Fortran sources) with -fsignaling-nans to ensure maximum compatibility. libgfortran/ChangeLog: PR fortran/82207 * Makefile.am: Pass -fsignaling-nans for IEEE files. * Makefile.in: Regenerate. * ieee/ieee_helper.c: Use issignaling macro to recognized signaling NaNs. gcc/testsuite/ChangeLog: PR fortran/82207 * gfortran.dg/ieee/signaling_1.f90: New test. * gfortran.dg/ieee/signaling_1_c.c: New file.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gfortran.dg/ieee/signaling_1.f9089
-rw-r--r--gcc/testsuite/gfortran.dg/ieee/signaling_1_c.c14
2 files changed, 103 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90 b/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90
new file mode 100644
index 0000000..a1403e6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/ieee/signaling_1.f90
@@ -0,0 +1,89 @@
+! { dg-do run }
+! { dg-require-effective-target issignaling } */
+! { dg-additional-sources signaling_1_c.c }
+! { dg-options "-fsignaling-nans" }
+!
+program test
+ use, intrinsic :: iso_c_binding
+ use, intrinsic :: ieee_arithmetic
+ implicit none
+
+ interface
+ real(kind=c_float) function create_nansf () bind(c)
+ import :: c_float
+ end function
+
+ real(kind=c_double) function create_nans () bind(c)
+ import :: c_double
+ end function
+
+ real(kind=c_long_double) function create_nansl () bind(c)
+ import :: c_long_double
+ end function
+ end interface
+
+ real(kind=c_float) :: x
+ real(kind=c_double) :: y
+ real(kind=c_long_double) :: z
+
+ if (ieee_support_nan(x)) then
+ x = create_nansf()
+ if (ieee_class(x) /= ieee_signaling_nan) stop 100
+ if (.not. ieee_is_nan(x)) stop 101
+ if (ieee_is_negative(x)) stop 102
+ if (ieee_is_finite(x)) stop 103
+ if (ieee_is_normal(x)) stop 104
+ if (.not. ieee_unordered(x, x)) stop 105
+ if (.not. ieee_unordered(x, 1._c_float)) stop 106
+
+ x = ieee_value(y, ieee_quiet_nan)
+ if (ieee_class(x) /= ieee_quiet_nan) stop 107
+ if (.not. ieee_is_nan(x)) stop 108
+ if (ieee_is_negative(x)) stop 109
+ if (ieee_is_finite(x)) stop 110
+ if (ieee_is_normal(x)) stop 111
+ if (.not. ieee_unordered(x, x)) stop 112
+ if (.not. ieee_unordered(x, 1._c_double)) stop 113
+ end if
+
+ if (ieee_support_nan(y)) then
+ y = create_nans()
+ if (ieee_class(y) /= ieee_signaling_nan) stop 200
+ if (.not. ieee_is_nan(y)) stop 201
+ if (ieee_is_negative(y)) stop 202
+ if (ieee_is_finite(y)) stop 203
+ if (ieee_is_normal(y)) stop 204
+ if (.not. ieee_unordered(y, x)) stop 205
+ if (.not. ieee_unordered(y, 1._c_double)) stop 206
+
+ y = ieee_value(y, ieee_quiet_nan)
+ if (ieee_class(y) /= ieee_quiet_nan) stop 207
+ if (.not. ieee_is_nan(y)) stop 208
+ if (ieee_is_negative(y)) stop 209
+ if (ieee_is_finite(y)) stop 210
+ if (ieee_is_normal(y)) stop 211
+ if (.not. ieee_unordered(y, y)) stop 212
+ if (.not. ieee_unordered(y, 1._c_double)) stop 213
+ end if
+
+ if (ieee_support_nan(z)) then
+ z = create_nansl()
+ if (ieee_class(z) /= ieee_signaling_nan) stop 300
+ if (.not. ieee_is_nan(z)) stop 301
+ if (ieee_is_negative(z)) stop 302
+ if (ieee_is_finite(z)) stop 303
+ if (ieee_is_normal(z)) stop 304
+ if (.not. ieee_unordered(z, z)) stop 305
+ if (.not. ieee_unordered(z, 1._c_long_double)) stop 306
+
+ z = ieee_value(y, ieee_quiet_nan)
+ if (ieee_class(z) /= ieee_quiet_nan) stop 307
+ if (.not. ieee_is_nan(z)) stop 308
+ if (ieee_is_negative(z)) stop 309
+ if (ieee_is_finite(z)) stop 310
+ if (ieee_is_normal(z)) stop 311
+ if (.not. ieee_unordered(z, z)) stop 312
+ if (.not. ieee_unordered(z, 1._c_double)) stop 313
+ end if
+
+end program test
diff --git a/gcc/testsuite/gfortran.dg/ieee/signaling_1_c.c b/gcc/testsuite/gfortran.dg/ieee/signaling_1_c.c
new file mode 100644
index 0000000..ab19bb7
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/ieee/signaling_1_c.c
@@ -0,0 +1,14 @@
+float create_nansf (void)
+{
+ return __builtin_nansf("");
+}
+
+double create_nans (void)
+{
+ return __builtin_nans("");
+}
+
+long double create_nansl (void)
+{
+ return __builtin_nansl("");
+}