blob: 7729df5cb6e672aa044576c318703cb9def364e9 [file] [log] [blame]
! { dg-do run }
! { dg-options "-std=gnu" }
!
! 13.7.53 INT(A [, KIND])
!
! Description. Convert to integer type.
! Class. Elemental function.
! Arguments.
! A shall be of type integer, real, or complex,
! or a boz-literal-constant .
! KIND (optional) shall be a scalar integer initialization expression.
!
! Result Characteristics. Integer. If KIND is present, the kind type
! parameter is that specified by the value of KIND; otherwise, the
! kind type parameter is that of default integer type.
!
! Result Value.
!
! Case (1): If A is of type integer, INT (A) = A.
!
! Case (2): If A is of type real, there are two cases:
! (a) if |A| < 1, INT (A) has the value 0
! (b) if |A| .ge. 1, INT (A) is the integer whose magnitude is the
! largest integer that does not exceed the magnitude of A and
! whose sign is the same as the sign of A.
!
! Case (3): If A is of type complex, INT(A) = INT(REAL(A, KIND(A))).
!
! Case (4): If A is a boz-literal-constant, it is treated as if it were
! an int-literal-constant with a kind-param that specifies the
! representation method with the largest decimal exponent range
! supported by the processor.
!
! Example. INT 3.7) has the value ­3.
!
module mykinds
integer, parameter :: ik1 = selected_int_kind(2)
integer, parameter :: ik2 = selected_int_kind(4)
integer, parameter :: ik4 = selected_int_kind(9)
integer, parameter :: ik8 = selected_int_kind(18)
integer, parameter :: sp = selected_real_kind(6,30)
integer, parameter :: dp = selected_real_kind(15,300)
integer, parameter :: ck = kind('a')
end module mykinds
program test_int
use mykinds
integer(ik1) i1
integer(ik2) i2
integer(ik4) i4
integer(ik8) i8
real(sp) r4
real(dp) r8
complex(sp) c4
complex(dp) c8
!
! Case 1
!
i1 = int(-3)
i2 = int(-3)
i4 = int(-3)
i8 = int(-3)
if (i1 /= -3_ik1 .or. i2 /= -3_ik2) STOP 1
if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 2
i1 = int(5, ik1)
i2 = int(i1, ik2)
i4 = int(i1, ik4)
i8 = int(i1, ik8)
if (i1 /= 5_ik1 .or. i2 /= 5_ik2) STOP 3
if (i4 /= 5_ik4 .or. i8 /= 5_ik8) STOP 4
i8 = int(10, ik8)
i1 = int(i8, ik1)
i2 = int(i8, ik2)
i4 = int(i8, ik4)
if (i1 /= 10_ik1 .or. i2 /= 10_ik2) STOP 5
if (i4 /= 10_ik4 .or. i8 /= 10_ik8) STOP 6
!
! case 2(b)
!
r4 = -3.7_sp
i1 = int(r4, ik1)
i2 = int(r4, ik2)
i4 = int(r4, ik4)
i8 = int(r4, ik8)
if (i1 /= -3_ik1 .or. i2 /= -3_ik2) STOP 7
if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 8
r8 = -3.7_dp
i1 = int(r8, ik1)
i2 = int(r8, ik2)
i4 = int(r8, ik4)
i8 = int(r8, ik8)
if (i1 /= -3_ik1 .or. i2 /= -3_ik2) STOP 9
if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 10
!
! Case 2(a)
!
r4 = -3.7E-1_sp
i1 = int(r4, ik1)
i2 = int(r4, ik2)
i4 = int(r4, ik4)
i8 = int(r4, ik8)
if (i1 /= 0_ik1 .or. i2 /= 0_ik2) STOP 11
if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 12
r8 = -3.7E-1_dp
i1 = int(r8, ik1)
i2 = int(r8, ik2)
i4 = int(r8, ik4)
i8 = int(r8, ik8)
if (i1 /= 0_ik1 .or. i2 /= 0_ik2) STOP 13
if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 14
!
! Case 3
!
c4 = (-3.7E-1_sp,3.7E-1_sp)
i1 = int(c4, ik1)
i2 = int(c4, ik2)
i4 = int(c4, ik4)
i8 = int(c4, ik8)
if (i1 /= 0_ik1 .or. i2 /= 0_ik2) STOP 15
if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 16
c8 = (-3.7E-1_dp,3.7E-1_dp)
i1 = int(c8, ik1)
i2 = int(c8, ik2)
i4 = int(c8, ik4)
i8 = int(c8, ik8)
if (i1 /= 0_ik1 .or. i2 /= 0_ik2) STOP 17
if (i4 /= 0_ik4 .or. i8 /= 0_ik8) STOP 18
c4 = (-3.7_sp,3.7_sp)
i1 = int(c4, ik1)
i2 = int(c4, ik2)
i4 = int(c4, ik4)
i8 = int(c4, ik8)
if (i1 /= -3_ik1 .or. i2 /= -3_ik2) STOP 19
if (i4 /= -3_ik4 .or. i8 /= -3_ik8) STOP 20
c8 = (3.7_dp,3.7_dp)
i1 = int(c8, ik1)
i2 = int(c8, ik2)
i4 = int(c8, ik4)
i8 = int(c8, ik8)
if (i1 /= 3_ik1 .or. i2 /= 3_ik2) STOP 21
if (i4 /= 3_ik4 .or. i8 /= 3_ik8) STOP 22
!
! Case 4
!
i1 = int(b'0011', ik1)
i2 = int(b'0011', ik2)
i4 = int(b'0011', ik4)
i8 = int(b'0011', ik8)
if (i1 /= 3_ik1 .or. i2 /= 3_ik2) STOP 23
if (i4 /= 3_ik4 .or. i8 /= 3_ik8) STOP 24
i1 = int(o'0011', ik1)
i2 = int(o'0011', ik2)
i4 = int(o'0011', ik4)
i8 = int(o'0011', ik8)
if (i1 /= 9_ik1 .or. i2 /= 9_ik2) STOP 25
if (i4 /= 9_ik4 .or. i8 /= 9_ik8) STOP 26
i1 = int(z'0011', ik1)
i2 = int(z'0011', ik2)
i4 = int(z'0011', ik4)
i8 = int(z'0011', ik8)
if (i1 /= 17_ik1 .or. i2 /= 17_ik2) STOP 27
if (i4 /= 17_ik4 .or. i8 /= 17_ik8) STOP 28
end program test_int