blob: 92ba769ff4960ab12057fc19b3803d8ef9477678 [file] [log] [blame]
! { dg-do run }
! This checks the patch for PR25395, in which equivalences within one
! segment were broken by indirect equivalences, depending on the
! offset of the variable that bridges the indirect equivalence.
!
! This is a fortran95 version of the original testcase, which was
! contributed by Harald Vogt <harald.vogt@desy.de>
program check_6
common /abc/ mwkx(80)
common /cde/ lischk(20)
dimension listpr(20),lisbit(10),lispat(8)
! This was badly compiled in the PR:
equivalence (listpr(10),lisbit(1),mwkx(10)), &
(lispat(1),listpr(10))
lischk = (/0, 0, 0, 0, 0, 0, 0, 0, 0, 1, &
2, 0, 0, 5, 6, 7, 8, 9,10, 0/)
call set_arrays (listpr, lisbit)
if (any (listpr.ne.lischk)) call abort ()
call sub1
call sub2
call sub3
end
subroutine sub1
common /abc/ mwkx(80)
common /cde/ lischk(20)
dimension listpr(20),lisbit(10),lispat(8)
! This workaround was OK
equivalence (listpr(10),lisbit(1)), &
(listpr(10),mwkx(10)), &
(listpr(10),lispat(1))
call set_arrays (listpr, lisbit)
if (any (listpr .ne. lischk)) call abort ()
end
!
! Equivalences not in COMMON
!___________________________
! This gave incorrect results for the same reason as in MAIN.
subroutine sub2
dimension mwkx(80)
common /cde/ lischk(20)
dimension listpr(20),lisbit(10),lispat(8)
equivalence (lispat(1),listpr(10)), &
(mwkx(10),lisbit(1),listpr(10))
call set_arrays (listpr, lisbit)
if (any (listpr .ne. lischk)) call abort ()
end
! This gave correct results because the order in which the
! equivalences are taken is different and was given in the PR.
subroutine sub3
dimension mwkx(80)
common /cde/ lischk(20)
dimension listpr(20),lisbit(10),lispat(8)
equivalence (listpr(10),lisbit(1),mwkx(10)), &
(lispat(1),listpr(10))
call set_arrays (listpr, lisbit)
if (any (listpr .ne. lischk)) call abort ()
end
subroutine set_arrays (listpr, lisbit)
dimension listpr(20),lisbit(10)
listpr = 0
lisbit = (/(i, i = 1, 10)/)
lisbit((/3,4/)) = 0
end