trans-io.cc (transfer_array_component) calls transfer_expr with
NULL code:
transfer_expr (&se, &cm->ts, tmp, NULL, NULL_TREE);
I'm surprised it doesn't ICE in other spots that dereference
code->whatever but each one is guarded with some condition
that perhaps don't trigger in that case for some reason.
Anyway, the &code->loc case does trigger, it doesn't ICE, but
it is undefined behavior in the compiler when code is NULL,
and we'd crash if the where argument of 3*sizeof(void*) is
dereferenced. Code I've checked can handle NULL where though.
2026-03-12 Jakub Jelinek <jakub@redhat.com>
PR fortran/124450
* trans-io.cc (transfer_expr): If code is NULL, call
transfer_array_component with NULL where argument rather than
&code->loc.
* gfortran.dg/pr124450.f90: New test.
if (c->attr.dimension)
{
- tmp = transfer_array_component (tmp, c, & code->loc);
+ tmp = transfer_array_component (tmp, c,
+ code ? &code->loc
+ : NULL);
gfc_add_expr_to_block (&se->pre, tmp);
}
else
--- /dev/null
+! PR fortran/124450
+! { dg-do compile }
+
+ type ta
+ integer(kind=4) :: a(1)
+ integer(kind=4) :: b(1)
+ end type ta
+ type tb
+ type(ta) :: c(1) = ta(1, 2)
+ end type tb
+ type(tb) :: e = tb(ta(3, 4))
+
+ print *, e
+end