https://gcc.gnu.org/g:83ef3db4b388e705281f82757c81e8c6746b41d0
commit r16-7750-g83ef3db4b388e705281f82757c81e8c6746b41d0 Author: Jerry DeLisle <[email protected]> Date: Wed Feb 25 20:50:57 2026 -0800 Fortran: New test cases from [PR123947] This PR was fixed by the fix for PR124235. Adding test cases to avoid regressions. PR fortran/123947 gcc/testsuite/ChangeLog: * gfortran.dg/pr123947_1.f90: New test. * gfortran.dg/pr123947_2.f90: New test. Diff: --- gcc/testsuite/gfortran.dg/pr123947_1.f90 | 29 +++++++++++++ gcc/testsuite/gfortran.dg/pr123947_2.f90 | 74 ++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/gcc/testsuite/gfortran.dg/pr123947_1.f90 b/gcc/testsuite/gfortran.dg/pr123947_1.f90 new file mode 100644 index 000000000000..30a21864f654 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr123947_1.f90 @@ -0,0 +1,29 @@ +! { dg-do compile } +! +! PR fortran/123947 +! Reduced from Bugzilla attachment 63564. +! Used to ICE in gfc_build_addr_expr from trans-array deep-copy handling. +! +TYPE TY0 +TYPE(TY0), ALLOCATABLE :: NODE0(:) +TYPE(TY), ALLOCATABLE :: NODE4(:) +TYPE(TY1),ALLOCATABLE :: NODE7(:) +END TYPE +TYPE TY1 +INTEGER,ALLOCATABLE :: II(:) +TYPE(TY0) :: NODE2(4) +TYPE(TY1), ALLOCATABLE :: NODE1(:) +TYPE(TY),ALLOCATABLE :: NODE5(:) +END TYPE +TYPE TY +INTEGER,ALLOCATABLE :: II(:) +TYPE(TY1) :: NODE3(4) +TYPE(TY),ALLOCATABLE :: NODE6(:) +END TYPE +TYPE BASE +TYPE(TY),ALLOCATABLE :: OBJ(:) +END TYPE +TYPE(BASE):: OBJ_BASE +ALLOCATE(OBJ_BASE%OBJ(2)%NODE6(2)%NODE6(3)) +ALLOCATE(OBJ_BASE%OBJ(2)%NODE6(2)%NODE6(2)%NODE6(3)) +END diff --git a/gcc/testsuite/gfortran.dg/pr123947_2.f90 b/gcc/testsuite/gfortran.dg/pr123947_2.f90 new file mode 100644 index 000000000000..e2e724978b10 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr123947_2.f90 @@ -0,0 +1,74 @@ +! { dg-do run } +! { dg-options "-O2" } +! This test from PR123947. Adapted from Fujitsu 0583_0023.f90 + +MODULE MOD1 +TYPE NODE +INTEGER,ALLOCATABLE :: VALUE +TYPE (NODE), ALLOCATABLE :: NEXT_NODE(:) +END TYPE + +TYPE TY +TYPE(NODE),ALLOCATABLE :: OBJ1(:) +TYPE(NODE),ALLOCATABLE :: OBJ2(:) +END TYPE +END MODULE + +CALL SUB() + +CONTAINS +SUBROUTINE SUB() +USE MOD1 +TYPE(TY)::BASE + +ALLOCATE(BASE%OBJ2(6)) +ALLOCATE(BASE%OBJ2(3)%VALUE) +ALLOCATE(BASE%OBJ2(5)%VALUE) + +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(2)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(3)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE(2)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(2)%NEXT_NODE(3)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(3)%NEXT_NODE(4)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(2)%NEXT_NODE(5)) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(2)%NEXT_NODE(2)%NEXT_NODE(5)) + +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(2)%VALUE) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(2)%NEXT_NODE(3)%VALUE) +ALLOCATE(BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE) + +BASE%OBJ2(3)%VALUE = 21 +BASE%OBJ2(5)%VALUE = 22 +BASE%OBJ2(5)%NEXT_NODE(2)%VALUE = 23 +BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE = 24 +BASE%OBJ2(5)%NEXT_NODE(2)%NEXT_NODE(3)%VALUE = 25 +BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE = 26 + +ALLOCATE(BASE%OBJ1, SOURCE = BASE%OBJ2(3:5)) + +BASE%OBJ2(3)%VALUE = 31 +BASE%OBJ2(5)%VALUE = 32 +BASE%OBJ2(5)%NEXT_NODE(2)%VALUE = 33 +BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE = 34 +BASE%OBJ2(5)%NEXT_NODE(2)%NEXT_NODE(3)%VALUE = 35 +BASE%OBJ2(5)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE = 36 + +if (BASE%OBJ1(1)%VALUE /= 21) stop 101 +if (BASE%OBJ1(3)%VALUE /= 22) stop 102 +if (BASE%OBJ1(3)%NEXT_NODE(2)%VALUE /= 23) stop 103 +if (BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE /= 24) stop 104 +if (BASE%OBJ1(3)%NEXT_NODE(2)%NEXT_NODE(3)%VALUE /= 25) stop 105 +if (BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE(2)%VALUE /= 26) stop 106 + +if (SIZE(BASE%OBJ1(3)%NEXT_NODE) /= 2) stop 201 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE) /= 3) stop 202 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE(1)%NEXT_NODE) /= 2) stop 203 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE(2)%NEXT_NODE) /= 3) stop 204 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(1)%NEXT_NODE(3)%NEXT_NODE) /= 4) stop 205 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(2)%NEXT_NODE) /= 5) stop 206 +if (SIZE(BASE%OBJ1(3)%NEXT_NODE(2)%NEXT_NODE(2)%NEXT_NODE) /= 5) stop 207 + +END SUBROUTINE + +END
