1! Test if MIN and MAX intrinsics behave correctly when passed NaNs
2! as arguments
3!
4! { dg-do run }
5! { dg-add-options ieee }
6!
7module aux2
8  interface isnan
9    module procedure isnan_r
10    module procedure isnan_d
11  end interface isnan
12
13  interface isinf
14    module procedure isinf_r
15    module procedure isinf_d
16  end interface isinf
17contains
18
19  pure function isnan_r(x) result (isnan)
20    logical :: isnan
21    real, intent(in) :: x
22
23    isnan = (.not.(x == x))
24  end function isnan_r
25
26  pure function isnan_d(x) result (isnan)
27    logical :: isnan
28    double precision, intent(in) :: x
29
30    isnan = (.not.(x == x))
31  end function isnan_d
32
33  pure function isinf_r(x) result (isinf)
34    logical :: isinf
35    real, intent(in) :: x
36
37    isinf = (x > huge(x)) .or. (x < -huge(x))
38  end function isinf_r
39
40  pure function isinf_d(x) result (isinf)
41    logical :: isinf
42    double precision, intent(in) :: x
43
44    isinf = (x > huge(x)) .or. (x < -huge(x))
45  end function isinf_d
46end module aux2
47
48program test
49  use aux2
50  implicit none
51  real :: nan, large, inf
52
53  ! Create a NaN and check it
54  nan = 0
55  nan = nan / nan
56  if (nan == nan .or. nan > nan .or. nan < nan .or. nan >= nan &
57      .or. nan <= nan) STOP 1
58  if (isnan (2.d0) .or. (.not. isnan(nan)) .or. &
59      (.not. isnan(real(nan,kind=kind(2.d0))))) STOP 2
60
61  ! Create an INF and check it
62  large = huge(large)
63  inf = 2 * large
64  if (isinf(nan) .or. isinf(large) .or. .not. isinf(inf)) STOP 3
65  if (isinf(-nan) .or. isinf(-large) .or. .not. isinf(-inf)) STOP 4
66
67  ! Check that MIN and MAX behave correctly
68
69  if (.not. isnan(min(nan,nan))) STOP 13
70  if (.not. isnan(max(nan,nan))) STOP 14
71
72  ! Same thing, with more arguments
73
74  if (.not. isnan(min(nan,nan,nan))) STOP 27
75  if (.not. isnan(max(nan,nan,nan))) STOP 28
76  if (.not. isnan(min(nan,nan,nan,nan))) STOP 29
77  if (.not. isnan(max(nan,nan,nan,nan))) STOP 30
78  if (.not. isnan(min(nan,nan,nan,nan,nan))) STOP 31
79  if (.not. isnan(max(nan,nan,nan,nan,nan))) STOP 32
80
81  ! Large values, INF and NaNs
82  if (.not. isinf(max(large, inf))) STOP 33
83  if (isinf(min(large, inf))) STOP 34
84
85  if (.not. isinf(min(-large, -inf))) STOP 41
86  if (isinf(max(-large, -inf))) STOP 42
87
88end program test
89