https://gcc.gnu.org/g:915d3e384e21fc57833463d3c2a08dcf6ff24788
commit r16-8491-g915d3e384e21fc57833463d3c2a08dcf6ff24788 Author: Paul Thomas <[email protected]> Date: Mon Apr 6 15:02:15 2026 +0100 Fortran: Fix ICE instantiating nested PDTs [PR124598] 2026-04-07 Paul Thomas <[email protected]> gcc/fortran PR fortran/124598 * trans-expr.cc (gfc_conv_structure): Do not add parameterized components to a structure constructor. gcc/testsuite/ PR fortran/124598 * gfortran.dg/pdt_91.f03: New test. Diff: --- gcc/fortran/trans-expr.cc | 4 +++- gcc/testsuite/gfortran.dg/pdt_91.f03 | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index f50ddce8e829..6c0bd5ce9107 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -10528,7 +10528,9 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) components. Although the latter have a default initializer of EXPR_NULL,... by default, the static nullify is not needed since this is done every time we come into scope. */ - if (!c->expr || (cm->attr.allocatable && cm->attr.flavor != FL_PROCEDURE)) + if (!c->expr + || (cm->attr.allocatable && cm->attr.flavor != FL_PROCEDURE) + || (IS_PDT (cm) && has_parameterized_comps (cm->ts.u.derived))) continue; if (cm->initializer && cm->initializer->expr_type != EXPR_NULL diff --git a/gcc/testsuite/gfortran.dg/pdt_91.f03 b/gcc/testsuite/gfortran.dg/pdt_91.f03 new file mode 100644 index 000000000000..ca0a79130ed2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pdt_91.f03 @@ -0,0 +1,30 @@ +! {dg-do compile } +! { dg-options "-fdump-tree-original" } +! +! Test the fix for PR124598. +! +! Contributed by Antoine Lemoine <[email protected]> +! +program test_pdt + implicit none + + type t_foo + integer :: c + end type t_foo + + type t_bar(n) + integer, len :: n = 1 + type(t_foo) :: foo(n) + end type t_bar + + type t_baz(n) + integer, len :: n = 1 + type(t_bar(n)) :: bar(n) + end type t_baz + + type(t_baz(n=10)) :: baz ! Used to ICE at this line +! baz%bar(1)%foo = t_foo(1) + print *, baz%bar(1)%foo +end program test_pdt +! Check that the upper bound for baz%bar%foo is set correctly. +! { dg-final { scan-tree-dump-times "foo.dim.0..ubound = 10" 1 "original" } }
