1! { dg-do run }
2! { dg-options "-std=gnu" }
3!
4! 13.7.53    INT(A [, KIND])
5!
6! Description.  Convert to integer type.
7! Class.       Elemental function.
8! Arguments.
9!    A               shall be of type integer, real, or complex,
10!                    or a boz-literal-constant .
11!    KIND (optional) shall be a scalar integer initialization expression.
12!
13! Result Characteristics. Integer. If KIND is present, the kind type
14!    parameter is that specified by the value of KIND; otherwise, the
15!    kind type parameter is that of default integer type.
16!
17! Result Value.
18!
19!    Case (1):  If A is of type integer, INT (A) = A.
20!
21!    Case (2):  If A is of type real, there are two cases:
22!      (a) if |A| < 1, INT (A) has the value 0
23!      (b) if |A| .ge. 1, INT (A) is the integer whose magnitude is the
24!          largest integer that does not exceed the magnitude of A and
25!          whose sign is the same as the sign of A.
26!
27!    Case (3):  If A is of type complex, INT(A) = INT(REAL(A, KIND(A))).
28!
29!    Case (4):  If A is a boz-literal-constant, it is treated as if it were
30!               an int-literal-constant with a kind-param that specifies the
31!               representation method with the largest decimal exponent range
32!               supported by the processor.
33!
34!    Example. INT (�3.7) has the value �3.
35!
36module mykinds
37   integer, parameter :: ik1 = selected_int_kind(2)
38   integer, parameter :: ik2 = selected_int_kind(4)
39   integer, parameter :: ik4 = selected_int_kind(9)
40   integer, parameter :: ik8 = selected_int_kind(18)
41   integer, parameter :: sp = selected_real_kind(6,30)
42   integer, parameter :: dp = selected_real_kind(15,300)
43   integer, parameter :: ck = kind('a')
44end module mykinds
45
46program test_int
47
48   use mykinds
49
50   integer(ik1) i1
51   integer(ik2) i2
52   integer(ik4) i4
53   integer(ik8) i8
54   real(sp) r4
55   real(dp) r8
56   complex(sp) c4
57   complex(dp) c8
58   !
59   ! Case 1
60   !
61   i1 = int(-3)
62   i2 = int(-3)
63   i4 = int(-3)
64   i8 = int(-3)
65   if (i1 /= -3_ik1 .or. i2 /= -3_ik2) call abort
66   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) call abort
67
68   i1 = int(5,  ik1)
69   i2 = int(i1, ik2)
70   i4 = int(i1, ik4)
71   i8 = int(i1, ik8)
72   if (i1 /= 5_ik1 .or. i2 /= 5_ik2) call abort
73   if (i4 /= 5_ik4 .or. i8 /= 5_ik8) call abort
74
75   i8 = int(10, ik8)
76   i1 = int(i8, ik1)
77   i2 = int(i8, ik2)
78   i4 = int(i8, ik4)
79   if (i1 /= 10_ik1 .or. i2 /= 10_ik2) call abort
80   if (i4 /= 10_ik4 .or. i8 /= 10_ik8) call abort
81   !
82   ! case 2(b)
83   !
84   r4 = -3.7_sp
85   i1 = int(r4,  ik1)
86   i2 = int(r4, ik2)
87   i4 = int(r4, ik4)
88   i8 = int(r4, ik8)
89   if (i1 /= -3_ik1 .or. i2 /= -3_ik2) call abort
90   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) call abort
91
92   r8 = -3.7_dp
93   i1 = int(r8,  ik1)
94   i2 = int(r8, ik2)
95   i4 = int(r8, ik4)
96   i8 = int(r8, ik8)
97   if (i1 /= -3_ik1 .or. i2 /= -3_ik2) call abort
98   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) call abort
99   !
100   ! Case 2(a)
101   !
102   r4 = -3.7E-1_sp
103   i1 = int(r4, ik1)
104   i2 = int(r4, ik2)
105   i4 = int(r4, ik4)
106   i8 = int(r4, ik8)
107   if (i1 /= 0_ik1 .or. i2 /= 0_ik2) call abort
108   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) call abort
109
110   r8 = -3.7E-1_dp
111   i1 = int(r8, ik1)
112   i2 = int(r8, ik2)
113   i4 = int(r8, ik4)
114   i8 = int(r8, ik8)
115   if (i1 /= 0_ik1 .or. i2 /= 0_ik2) call abort
116   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) call abort
117   !
118   ! Case 3
119   !
120   c4 = (-3.7E-1_sp,3.7E-1_sp)
121   i1 = int(c4, ik1)
122   i2 = int(c4, ik2)
123   i4 = int(c4, ik4)
124   i8 = int(c4, ik8)
125   if (i1 /= 0_ik1 .or. i2 /= 0_ik2) call abort
126   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) call abort
127
128   c8 = (-3.7E-1_dp,3.7E-1_dp)
129   i1 = int(c8, ik1)
130   i2 = int(c8, ik2)
131   i4 = int(c8, ik4)
132   i8 = int(c8, ik8)
133   if (i1 /= 0_ik1 .or. i2 /= 0_ik2) call abort
134   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) call abort
135
136   c4 = (-3.7_sp,3.7_sp)
137   i1 = int(c4, ik1)
138   i2 = int(c4, ik2)
139   i4 = int(c4, ik4)
140   i8 = int(c4, ik8)
141   if (i1 /= -3_ik1 .or. i2 /= -3_ik2) call abort
142   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) call abort
143
144   c8 = (3.7_dp,3.7_dp)
145   i1 = int(c8, ik1)
146   i2 = int(c8, ik2)
147   i4 = int(c8, ik4)
148   i8 = int(c8, ik8)
149   if (i1 /= 3_ik1 .or. i2 /= 3_ik2) call abort
150   if (i4 /= 3_ik4 .or. i8 /= 3_ik8) call abort
151   !
152   ! Case 4
153   !
154   i1 = int(b'0011', ik1)
155   i2 = int(b'0011', ik2)
156   i4 = int(b'0011', ik4)
157   i8 = int(b'0011', ik8)
158   if (i1 /= 3_ik1 .or. i2 /= 3_ik2) call abort
159   if (i4 /= 3_ik4 .or. i8 /= 3_ik8) call abort
160   i1 = int(o'0011', ik1)
161   i2 = int(o'0011', ik2)
162   i4 = int(o'0011', ik4)
163   i8 = int(o'0011', ik8)
164   if (i1 /= 9_ik1 .or. i2 /= 9_ik2) call abort
165   if (i4 /= 9_ik4 .or. i8 /= 9_ik8) call abort
166   i1 = int(z'0011', ik1)
167   i2 = int(z'0011', ik2)
168   i4 = int(z'0011', ik4)
169   i8 = int(z'0011', ik8)
170   if (i1 /= 17_ik1 .or. i2 /= 17_ik2) call abort
171   if (i4 /= 17_ik4 .or. i8 /= 17_ik8) call abort
172
173end program test_int
174