1! { dg-do run }
2! { dg-options "-fno-range-check" }
3! PR fortran/32083
4!
5! Test transfers of +Inf and -Inf
6! Testcase contributed by Jos de Kloe <kloedej@knmi.nl>
7!
8
9PROGRAM TestInfinite
10  IMPLICIT NONE
11  integer, parameter :: i8_ = Selected_Int_Kind(18)  ! = integer*8
12  integer, parameter :: r8_ = Selected_Real_Kind(15,307)  ! = real*8
13
14  integer(i8_), parameter :: bit_pattern_PosInf_i8_p = 9218868437227405312_i8_
15  integer(i8_), parameter :: bit_pattern_NegInf_i8_p = -4503599627370496_i8_
16
17  integer(i8_) :: bit_pattern_PosInf_i8 = 9218868437227405312_i8_
18  integer(i8_) :: bit_pattern_NegInf_i8 = -4503599627370496_i8_
19
20  integer(i8_) :: bit_pattern_PosInf_i8_hex
21  integer(i8_) :: bit_pattern_NegInf_i8_hex
22
23  integer(i8_) :: i
24  real(r8_)    :: r
25
26  data bit_pattern_PosInf_i8_hex /z'7FF0000000000000'/
27  !data bit_pattern_NegInf_i8_hex /z'FFF0000000000000'/
28  ! not portable, replaced by:
29  bit_pattern_NegInf_i8_hex = ibset(bit_pattern_PosInf_i8_hex,63)
30
31  if (bit_pattern_NegInf_i8_hex /= bit_pattern_NegInf_i8) STOP 1
32  if (bit_pattern_PosInf_i8_hex /= bit_pattern_PosInf_i8) STOP 2
33
34  r = transfer(bit_pattern_PosInf_i8,r)
35  if (r /= 1.0_r8_/0.0_r8_) STOP 3
36  i = transfer(r,i)
37  if (bit_pattern_PosInf_i8 /= i) STOP 4
38
39  r = transfer(bit_pattern_NegInf_i8,r)
40  if (r /= -1.0_r8_/0.0_r8_) STOP 5
41  i = transfer(r,i)
42  if (bit_pattern_NegInf_i8 /= i) STOP 6
43
44  r = transfer(bit_pattern_PosInf_i8_p,r)
45  if (r /= 1.0_r8_/0.0_r8_) STOP 7
46  i = transfer(r,i)
47  if (bit_pattern_PosInf_i8_p /= i) STOP 8
48
49  r = transfer(bit_pattern_NegInf_i8_p,r)
50  if (r /= -1.0_r8_/0.0_r8_) STOP 9
51  i = transfer(r,i)
52  if (bit_pattern_NegInf_i8_p /= i) STOP 10
53END PROGRAM TestInfinite
54