mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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:
committed by
Jerry DeLisle
parent
31bb9e6dba
commit
a9a1ed3499
@@ -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:
|
||||
|
||||
14
gcc/testsuite/gfortran.dg/pr103367.f90
Normal file
14
gcc/testsuite/gfortran.dg/pr103367.f90
Normal 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
|
||||
Reference in New Issue
Block a user