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>
&& 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:
--- /dev/null
+! { 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