[gcc r13-10405] fortran: Fix ICE in gfc_conv_array_initializer with invalid index [PR103367]

Jerry DeLisle via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:f182ffd6915112628ecd1fe45db3d9bc5de13c61

commit r13-10405-gf182ffd6915112628ecd1fe45db3d9bc5de13c61
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]>
    (cherry picked from commit a9a1ed349974f03e9ba32dc21cce7e20cd7119ee)

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 fd466dc3e367..cf4f7cda7add 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6382,6 +6382,15 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr)
       && !expr->ref)
     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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.