[gcc r15-11359] 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:6181d4761b99a1734bb88b6cf96e6f11d7991982

commit r15-11359-g6181d4761b99a1734bb88b6cf96e6f11d7991982
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 a601c3854558..9b1754027fdd 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6904,6 +6904,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.