! { 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