blob: 40e8466c132f14c584a40ff5b70a432baee85a4c [file] [log] [blame]
! { dg-do run }
! { dg-additional-options "-ffree-line-length-none" }
program foo
use ieee_arithmetic
use iso_fortran_env
implicit none
! This allows us to test REAL128 if it exists, and still compile
! on platforms were it is not present
! https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89639
integer, parameter :: large = merge(real128, real64, real128 > 0)
real, volatile :: rnan, rinf
double precision, volatile :: dnan, dinf
real(kind=large), volatile :: lnan, linf
logical :: flag
rinf = ieee_value(0., ieee_positive_inf)
rnan = ieee_value(0., ieee_quiet_nan)
dinf = ieee_value(0.d0, ieee_positive_inf)
dnan = ieee_value(0.d0, ieee_quiet_nan)
linf = ieee_value(0._large, ieee_positive_inf)
lnan = ieee_value(0._large, ieee_quiet_nan)
#define CHECK_INVALID(expected) \
call ieee_get_flag(ieee_invalid, flag) ; \
if (flag .neqv. expected) then ; \
write (*,*) "Check failed at ", __LINE__ ; \
stop 1; \
end if ; \
call ieee_set_flag(ieee_invalid, .false.)
!! REAL
! Signaling versions
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_eq (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_eq (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_eq (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_ne (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_le (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_le (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_le (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_lt (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_lt (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_ge (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_ge (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_ge (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0., rnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_gt (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_gt (rnan, rnan)) stop 15
CHECK_INVALID(.true.)
! Quiet versions
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_eq (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_le (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_le (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_lt (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_lt (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_ge (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0., 0.)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0., -0.)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0., rnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0., rinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_gt (rnan, rnan)) stop 15
CHECK_INVALID(.false.)
!! DOUBLE PRECISION
! Signaling versions
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_eq (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_eq (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_eq (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_ne (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_le (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_le (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_le (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_lt (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_lt (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_ge (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_ge (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_ge (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0.d0, dnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_gt (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_gt (dnan, dnan)) stop 15
CHECK_INVALID(.true.)
! Quiet versions
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_eq (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_le (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_le (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_lt (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_lt (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_ge (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0.d0, 0.d0)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0.d0, -0.d0)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0.d0, dnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0.d0, dinf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_gt (dnan, dnan)) stop 15
CHECK_INVALID(.false.)
!! LARGE KIND
! Signaling versions
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_eq (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_eq (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_eq (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_eq (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_ne (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_ne (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ne (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_le (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_le (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_le (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_le (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_lt (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (.not. ieee_signaling_lt (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_lt (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_signaling_ge (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_ge (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_ge (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_ge (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_signaling_gt (0._large, lnan)) stop 13
CHECK_INVALID(.true.)
if (ieee_signaling_gt (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_signaling_gt (lnan, lnan)) stop 15
CHECK_INVALID(.true.)
! Quiet versions
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_eq (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_eq (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_eq (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_ne (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ne (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_le (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_le (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_le (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_lt (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (.not. ieee_quiet_lt (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_lt (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (.not. ieee_quiet_ge (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_ge (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_ge (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0._large, 0._large)) stop 11
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0._large, -0._large)) stop 12
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0._large, lnan)) stop 13
CHECK_INVALID(.false.)
if (ieee_quiet_gt (0._large, linf)) stop 14
CHECK_INVALID(.false.)
if (ieee_quiet_gt (lnan, lnan)) stop 15
CHECK_INVALID(.false.)
end program foo