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

Reply via email to