https://gcc.gnu.org/g:a9a1ed349974f03e9ba32dc21cce7e20cd7119ee
commit r16-8509-ga9a1ed349974f03e9ba32dc21cce7e20cd7119ee Author: Christopher Albert <[email protected]> Date: Sun Mar 29 22:18:43 2026 +0200 fortran: Fix ICE in gfc_conv_array_initializer with invalid index [PR103367] An undefined variable used as an array index in a parameter initializer expression reaches gfc_conv_array_initializer after parameter substitution with an unexpected expression type, hitting gcc_unreachable(). Guard against unexpected expression types by returning a zero-filled constructor, since the frontend has already diagnosed the error. PR fortran/103367 gcc/fortran/ChangeLog: * trans-array.cc (gfc_conv_array_initializer): Return empty constructor for unexpected expression types after parameter substitution. gcc/testsuite/ChangeLog: * gfortran.dg/pr103367.f90: New test. Signed-off-by: Christopher Albert <[email protected]> Diff: --- gcc/fortran/trans-array.cc | 9 +++++++++ gcc/testsuite/gfortran.dg/pr103367.f90 | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index d03fe1daccf4..ed299c8b21bb 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -7098,6 +7098,15 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) && expr->symtree->n.sym->value) expr = expr->symtree->n.sym->value; + /* After parameter substitution the expression should be a constant, array + constructor, structure constructor, or NULL. Anything else means the + frontend already diagnosed an error; return a zero-filled array. */ + if (expr->expr_type != EXPR_CONSTANT + && expr->expr_type != EXPR_STRUCTURE + && expr->expr_type != EXPR_ARRAY + && expr->expr_type != EXPR_NULL) + return build_constructor (type, NULL); + switch (expr->expr_type) { case EXPR_CONSTANT: diff --git a/gcc/testsuite/gfortran.dg/pr103367.f90 b/gcc/testsuite/gfortran.dg/pr103367.f90 new file mode 100644 index 000000000000..c4c860c65ffd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr103367.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! +! PR fortran/103367 +! An undefined variable in a parameter array initializer reached +! gfc_conv_array_initializer and hit gcc_unreachable(). + +program p + type t + integer :: a(1,2) = 3 + end type + type(t), parameter :: x(1) = t(4) + integer :: y(1,2) = (x(b)%a) ! { dg-warning "Legacy Extension" } + print *, y +end
