bug1-simplify-len-ice.f90 fails in compilation with: f951: internal compiler error: Segmentation fault 0x276485f internal_error(char const*, ...) ../../gcc/gcc/diagnostic-global-context.cc:787 0xfa57cf crash_signal ../../gcc/gcc/toplev.cc:325 0x81decb gfc_simplify_len(gfc_expr*, gfc_expr*) ../../gcc/gcc/fortran/simplify.cc:5085 0x76a949 do_simplify ../../gcc/gcc/fortran/intrinsic.cc:5002
The attached tidies up the appearance of the code around the fix and punts on null symtrees. Passes regtesting on FC44/x86_64. OK for mainline. Cheers Paul
From aa0025d5b26d35e05b467ef41809b9eac917339a Mon Sep 17 00:00:00 2001 From: Paul Thomas <[email protected]> Date: Tue, 6 Oct 2026 14:32:16 +0100 Subject: [PATCH] Fortran: [meta-bug] [PDT] Parameterized derived type errors [PR82173] 2026-10-06 Paul Thomas <[email protected]> gcc/fortran PR fortran/82173 * simplify.cc (gfc_simplify_len): Replace the long expression for the component character length with 'len'. If both symtrees are present, try to find the component, else return NULL. gcc/testsuite/ PR fortran/82173 * gfortran.dg/pdt_bug1.f90: New test. --- gcc/fortran/simplify.cc | 16 ++++++++-------- gcc/testsuite/gfortran.dg/pdt_bug1.f90 | 11 +++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pdt_bug1.f90 diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc index f0b36c06687..c756bedf2e4 100644 --- a/gcc/fortran/simplify.cc +++ b/gcc/fortran/simplify.cc @@ -5066,14 +5066,12 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind) && e->ref->u.c.component->ts.type == BT_CHARACTER && e->ref->u.c.component->ts.u.cl->length) { + gfc_expr *len = e->ref->u.c.component->ts.u.cl->length; if (gfc_init_expr_flag) { gfc_expr* tmp; tmp = gfc_pdt_find_component_copy_initializer (e->symtree->n.sym, - e->ref->u.c - .component->ts.u.cl - ->length->symtree - ->name); + len->symtree->name); if (tmp) return tmp; } @@ -5082,10 +5080,12 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind) gfc_expr *len_expr = gfc_copy_expr (e); gfc_free_ref_list (len_expr->ref); len_expr->ref = NULL; - gfc_find_component (len_expr->symtree->n.sym->ts.u.derived, e->ref - ->u.c.component->ts.u.cl->length->symtree - ->name, - false, true, &len_expr->ref); + if (len_expr->symtree && len->symtree) + gfc_find_component (len_expr->symtree->n.sym->ts.u.derived, + len->symtree->name, + false, true, &len_expr->ref); + else + return NULL; len_expr->ts = len_expr->ref->u.c.component->ts; return len_expr; } diff --git a/gcc/testsuite/gfortran.dg/pdt_bug1.f90 b/gcc/testsuite/gfortran.dg/pdt_bug1.f90 new file mode 100644 index 00000000000..e14f5d68e6f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pdt_bug1.f90 @@ -0,0 +1,11 @@ +! { dg-do run } +! Used to ICE at line 10 in simplify.cc(gfc_simplify_len). +! See attachment to PR82173 comment 10 - reproducers/bug1-simplify_len_ice.f90 +program r6 + type :: t(n) + integer, len :: n = 2 + character(len=2*n) :: s + end type + type(t(3)) :: p + if (len (p%s) /= 6) stop 1 +end program -- 2.55.0
