2 ! { dg-additional-options "-ffree-line-length-none" }
3 ! { dg-additional-options "-mfp-trap-mode=sui" { target alpha*-*-* } }
5 ! Use dg-additional-options rather than dg-options to avoid overwriting the
6 ! default IEEE options which are passed by ieee.exp and necessary.
8 use ieee_features, only : ieee_datatype, ieee_denormal, ieee_divide, &
9 ieee_halting, ieee_inexact_flag, ieee_inf, ieee_invalid_flag, &
10 ieee_nan, ieee_rounding, ieee_sqrt, ieee_underflow_flag
15 type(ieee_flag_type), parameter :: x(5) = &
16 [ IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, &
17 IEEE_UNDERFLOW, IEEE_INEXACT ]
18 logical :: l(5) = .false.
21 #define FLAGS_STRING(S) \
22 call ieee_get_flag(x, l) ; \
23 write(S,"(5(A1))") merge(["I","O","Z","U","P"],[" "," "," "," "," "],l)
25 #define CHECK_FLAGS(expected) \
27 if (s /= expected) then ; \
28 write (*,"(A,I0,A,A)") "Flags at line ", __LINE__, ": ", s ; \
34 double precision, volatile :: dx
36 ! This file tests IEEE_SET_FLAG and IEEE_GET_FLAG
40 ! Initial flags are all off
43 ! Check we can clear them
44 call ieee_set_flag(ieee_all, .false.)
47 ! Raise invalid, then clear
51 call ieee_set_flag(ieee_all, .false.)
54 ! Raise overflow and precision
60 ! Also raise divide-by-zero
66 call ieee_set_flag([ieee_overflow,ieee_inexact,&
67 ieee_divide_by_zero],[.false.,.false.,.true.])
69 call ieee_set_flag(ieee_divide_by_zero, .false.)
79 call ieee_set_flag(ieee_all, .true.)
83 call ieee_set_flag(ieee_all, .false.)
88 ! Initial flags are all off
91 ! Check we can clear them
92 call ieee_set_flag(ieee_all, .false.)
95 ! Raise invalid, then clear
99 call ieee_set_flag(ieee_all, .false.)
102 ! Raise overflow and precision
108 ! Also raise divide-by-zero
114 call ieee_set_flag([ieee_overflow,ieee_inexact,&
115 ieee_divide_by_zero],[.false.,.false.,.true.])
117 call ieee_set_flag(ieee_divide_by_zero, .false.)
127 call ieee_set_flag(ieee_all, .true.)
131 call ieee_set_flag(ieee_all, .false.)
136 subroutine check_flag_sub
138 logical :: l(5) = .false.
139 type(ieee_flag_type), parameter :: x(5) = &
140 [ IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, &
141 IEEE_UNDERFLOW, IEEE_INEXACT ]
142 call ieee_get_flag(x, l)
145 print *, "Flags not cleared in subroutine"