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

Reply via email to