equiv_6.f90
来自「用于进行gcc测试」· F90 代码 · 共 78 行
F90
78 行
! { 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/)! These two calls replace the previously made call to subroutine! set_arrays which was erroneous because of parameter-induced ! aliasing. call set_array_listpr (listpr) call set_array_lisbit (lisbit) if (any (listpr.ne.lischk)) call abort () call sub1 call sub2 call sub3endsubroutine 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_array_listpr (listpr) call set_array_lisbit (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_array_listpr (listpr) call set_array_lisbit (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_array_listpr (listpr) call set_array_lisbit (lisbit) if (any (listpr .ne. lischk)) call abort ()endsubroutine set_array_listpr (listpr) dimension listpr(20) listpr = 0endsubroutine set_array_lisbit (lisbit) dimension lisbit(10) lisbit = (/(i, i = 1, 10)/) lisbit((/3,4/)) = 0end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?