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 <albert@tugraz.at>
This commit is contained in:
Christopher Albert
2026-03-29 22:18:43 +02:00
committed by Jerry DeLisle
parent 31bb9e6dba
commit a9a1ed3499
2 changed files with 23 additions and 0 deletions

View File

@@ -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:

View File

@@ -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