blob: 4eb0ba728b359f268436c5f2ea2e81a132774f5b [file] [log] [blame]
! { dg-do run }
!
! Test shift intrinsics when the SHIFT argument equals BIT_SIZE(arg1).
program test
implicit none
! Test compile-time simplifications
if (ishft (-1, 32) /= 0) stop 1 ! 0 -> simplify_shift OK
if (ishft (-1,-32) /= 0) stop 2 ! 0 -> simplify_shift OK
if (shiftl (-1, 32) /= 0) stop 3 ! 0 -> simplify_shift OK
if (shiftr (-1, 32) /= 0) stop 4 ! 0 -> simplify_shift OK
if (shifta (-1, 32) /= -1) stop 5 ! -1 -> simplify_shift OK
if (rshift (-1, 32) /= -1) stop 6 ! -1 -> simplify_shift OK
if (lshift (-1, 32) /= 0) stop 7 ! 0 -> simplify_shift OK
! Test run-time
call foo (-1)
contains
subroutine foo (n)
integer(4) :: i, j, k, n
integer, parameter :: bb = bit_size (n)
! Test code generated by gfc_conv_intrinsic_ishft
i = ishft (n, bb) ! Logical (left) shift (Fortran 2008)
j = ishft (n,-bb) ! Logical (right) shift (Fortran 2008)
if (i /= 0) stop 11
if (j /= 0) stop 12
! Test code generated by gfc_conv_intrinsic_shift:
i = shiftl (n, bb) ! Logical left shift (Fortran 2008)
j = shiftr (n, bb) ! Logical right shift (Fortran 2008)
k = shifta (n, bb) ! Arithmetic right shift (Fortran 2008)
if (i /= 0) stop 13
if (j /= 0) stop 14
if (k /= -1) stop 15
i = lshift (n, bb) ! Logical left shift (GNU extension)
j = rshift (n, bb) ! Arithmetic right shift (GNU extension)
if (i /= 0) stop 16
if (j /= -1) stop 17
do i = bb-1,bb
if (shifta (n, i) /= -1) stop 18
if (rshift (n, i) /= -1) stop 19
end do
end subroutine foo
end program test