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) STOP 1
66   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 2
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) STOP 3
73   if (i4 /= 5_ik4 .or. i8 /= 5_ik8) STOP 4
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) STOP 5
80   if (i4 /= 10_ik4 .or. i8 /= 10_ik8) STOP 6
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) STOP 7
90   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 8
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) STOP 9
98   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 10
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) STOP 11
108   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 12
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) STOP 13
116   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 14
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) STOP 15
126   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 16
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) STOP 17
134   if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 18
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) STOP 19
142   if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 20
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) STOP 21
150   if (i4 /= 3_ik4 .or. i8 /= 3_ik8) STOP 22
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) STOP 23
159   if (i4 /= 3_ik4 .or. i8 /= 3_ik8) STOP 24
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) STOP 25
165   if (i4 /= 9_ik4 .or. i8 /= 9_ik8) STOP 26
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) STOP 27
171   if (i4 /= 17_ik4 .or. i8 /= 17_ik8) STOP 28
172
173end program test_int
174