summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/mvbits_4.f90
blob: b8d32140c78bed3dfdcc8c2c439f32c6930f5da5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
! { dg-do run }

! PR fortran/35681
! Check that dependencies of MVBITS arguments are resolved correctly by using
! temporaries if both arguments refer to the same variable.

  integer, dimension(10) :: ila1 = (/1,2,3,4,5,6,7,8,9,10/)
  integer, dimension(20) :: ila2
  integer, dimension(10), target :: ila3
  integer, pointer :: ila3_ptr(:)
  integer, parameter :: SHOULD_BE(10) = (/17,18,11,4,13,22,7,16,9,18/)
  integer, parameter :: INDEX_VECTOR(10) = (/9,9,6,2,4,9,2,9,6,10/)

  ila2(2:20:2) = ila1
  ila3 = ila1

  ! Argument is already packed.
  call mvbits (ila1(INDEX_VECTOR), 2, 4, ila1, 3)
  write (*,'(10(I3))') ila1
  if (any (ila1 /= SHOULD_BE)) call abort ()

  ! Argument is not packed.
  call mvbits (ila2(2*INDEX_VECTOR), 2, 4, ila2(2:20:2), 3)
  write (*,'(10(I3))') ila2(2:20:2)
  if (any (ila2(2:20:2) /= SHOULD_BE)) call abort ()

  ! Pointer and target
  ila3_ptr => ila3
  call mvbits (ila3(INDEX_VECTOR), 2, 4, ila3_ptr, 3)
  write (*,'(10(I3))') ila3
  if (any (ila3 /= SHOULD_BE)) call abort ()

  end