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."