[gcc r14-12730] 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:2995f1a12ff87759fcfb93b99377ff4560c3d6f5

commit r14-12730-g2995f1a12ff87759fcfb93b99377ff4560c3d6f5
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 3d3dda8f4d2c..43bcd0f13dc8 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6629,6 +6629,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
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.