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

Reply via email to