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.
14 ! k1 and k2 will be large real kinds, if supported, and single/double
16 integer, parameter :: k1 = &
17 max(ieee_selected_real_kind(precision(0.d0) + 1), kind(0.))
18 integer, parameter :: k2 = &
19 max(ieee_selected_real_kind(precision(0._k1) + 1), kind(0.d0))
21 type(ieee_flag_type), parameter :: x(5) = &
22 [ IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, &
23 IEEE_UNDERFLOW, IEEE_INEXACT ]
24 logical :: l(5) = .false.
27 #define FLAGS_STRING(S) \
28 call ieee_get_flag(x, l) ; \
29 write(S,"(5(A1))") merge(["I","O","Z","U","P"],[" "," "," "," "," "],l)
31 #define CHECK_FLAGS(expected) \
33 if (s /= expected) then ; \
34 write (*,"(A,I0,A,A)") "Flags at line ", __LINE__, ": ", s ; \
39 real(kind=k1), volatile :: sx
40 real(kind=k2), volatile :: dx
42 ! This file tests IEEE_SET_FLAG and IEEE_GET_FLAG
46 ! Initial flags are all off
49 ! Check we can clear them
50 call ieee_set_flag(ieee_all, .false.)
53 ! Raise invalid, then clear
57 call ieee_set_flag(ieee_all, .false.)
60 ! Raise overflow and precision
66 ! Also raise divide-by-zero
72 call ieee_set_flag([ieee_overflow,ieee_inexact,&
73 ieee_divide_by_zero],[.false.,.false.,.true.])
75 call ieee_set_flag(ieee_divide_by_zero, .false.)
85 call ieee_set_flag(ieee_all, .true.)
89 call ieee_set_flag(ieee_all, .false.)
95 ! Initial flags are all off
98 ! Check we can clear them
99 call ieee_set_flag(ieee_all, .false.)
102 ! Raise invalid, then clear
106 call ieee_set_flag(ieee_all, .false.)
109 ! Raise overflow and precision
115 ! Also raise divide-by-zero
121 call ieee_set_flag([ieee_overflow,ieee_inexact,&
122 ieee_divide_by_zero],[.false.,.false.,.true.])
124 call ieee_set_flag(ieee_divide_by_zero, .false.)
134 call ieee_set_flag(ieee_all, .true.)
138 call ieee_set_flag(ieee_all, .false.)
143 subroutine check_flag_sub
145 logical :: l(5) = .false.
146 type(ieee_flag_type), parameter :: x(5) = &
147 [ IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, &
148 IEEE_UNDERFLOW, IEEE_INEXACT ]
149 call ieee_get_flag(x, l)
152 print *, "Flags not cleared in subroutine"