FX <fxcoud...@gmail.com> writes:

> Index: gcc/testsuite/gfortran.dg/ieee/ieee_6.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/ieee/ieee_6.f90 (revision 0)
> +++ gcc/testsuite/gfortran.dg/ieee/ieee_6.f90 (revision 0)
> @@ -0,0 +1,78 @@
> +! { dg-do run }
> +!
> +! This test will fail on older x86_64 glibc (< 2.20), due to this bug:
> +! https://sourceware.org/bugzilla/show_bug.cgi?id=16198
> +! We usually won't see it anyway, because on such systems x86_64 assembly
> +! (libgfortran/config/fpu-387.h) is used.
> +!
> +  use :: ieee_arithmetic
> +  implicit none
> +
> +  type(ieee_status_type) :: s1, s2
> +  logical :: flags(5), halt(5)
> +  type(ieee_round_type) :: mode
> +  real :: x
> +
> +  ! Test IEEE_GET_STATUS and IEEE_SET_STATUS
> +
> +  call ieee_set_flag(ieee_all, .false.)
> +  call ieee_set_rounding_mode(ieee_down)
> +  call ieee_set_halting_mode(ieee_all, .false.)
> +
> +  call ieee_get_status(s1)
> +  call ieee_set_status(s1)
> +
> +  call ieee_get_flag(ieee_all, flags)
> +  if (any(flags)) call abort
> +  call ieee_get_rounding_mode(mode)
> +  if (mode /= ieee_down) call abort
> +  call ieee_get_halting_mode(ieee_all, halt)
> +  if (any(halt)) call abort
> +
> +  call ieee_set_rounding_mode(ieee_to_zero)
> +  call ieee_set_flag(ieee_underflow, .true.)

This may raise inexact, see C11 7.6.2.3.  Installed as obvious.

Andreas.

        * gfortran.dg/ieee/ieee_6.f90: Allow inexact together with
        underflow.

Index: gfortran.dg/ieee/ieee_6.f90
===================================================================
--- gfortran.dg/ieee/ieee_6.f90 (revision 212119)
+++ gfortran.dg/ieee/ieee_6.f90 (working copy)
@@ -40,7 +40,9 @@
 
   call ieee_get_flag(ieee_all, flags)
   if (.not. (all(flags .eqv. [.false.,.false.,.true.,.true.,.false.]) &
-             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]))) 
call abort
+             .or. all(flags .eqv. [.false.,.false.,.true.,.true.,.true.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.true.]))) 
call abort
   call ieee_get_rounding_mode(mode)
   if (mode /= ieee_to_zero) call abort
   call ieee_get_halting_mode(ieee_all, halt)
@@ -50,7 +52,9 @@
 
   call ieee_get_flag(ieee_all, flags)
   if (.not. (all(flags .eqv. [.false.,.false.,.true.,.true.,.false.]) &
-             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]))) 
call abort
+             .or. all(flags .eqv. [.false.,.false.,.true.,.true.,.true.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.true.]))) 
call abort
   call ieee_get_rounding_mode(mode)
   if (mode /= ieee_to_zero) call abort
   call ieee_get_halting_mode(ieee_all, halt)
@@ -69,7 +73,9 @@
 
   call ieee_get_flag(ieee_all, flags)
   if (.not. (all(flags .eqv. [.false.,.false.,.true.,.true.,.false.]) &
-             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]))) 
call abort
+             .or. all(flags .eqv. [.false.,.false.,.true.,.true.,.true.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.false.]) &
+             .or. all(flags .eqv. [.false.,.false.,.true.,.false.,.true.]))) 
call abort
   call ieee_get_rounding_mode(mode)
   if (mode /= ieee_to_zero) call abort
   call ieee_get_halting_mode(ieee_all, halt)

-- 
Andreas Schwab, sch...@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

Reply via email to