Fortran: error recovery simplifying UNPACK for insufficient FIELD [PR107922]

gcc/fortran/ChangeLog:

	PR fortran/107922
	* simplify.cc (gfc_simplify_unpack): Terminate simplification when
	array-valued argument FIELD does not provide enough elements.

gcc/testsuite/ChangeLog:

	PR fortran/107922
	* gfortran.dg/unpack_field_1.f90: New test.
This commit is contained in:
Harald Anlauf 2022-12-01 21:16:46 +01:00
parent 98d6e4b6f1
commit 24b9337d1f
2 changed files with 25 additions and 1 deletions

View file

@ -8485,7 +8485,16 @@ gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
}
}
else if (field->expr_type == EXPR_ARRAY)
e = gfc_copy_expr (field_ctor->expr);
{
if (field_ctor)
e = gfc_copy_expr (field_ctor->expr);
else
{
/* Not enough elements in array FIELD. */
gfc_free_expr (result);
return &gfc_bad_expr;
}
}
else
e = gfc_copy_expr (field);

View file

@ -0,0 +1,15 @@
! { dg-do compile }
! PR fortran/107922 - ICE in gfc_simplify_unpack
! Test error recovery when shapes of FIELD and MASK do not match
! Contributed by G.Steinmetz
program p
integer, parameter :: a(2) = 1
integer, parameter :: d(3) = 1
logical, parameter :: mask(3) = [.false.,.true.,.false.]
integer, parameter :: b(2) = unpack(a,mask,a) ! { dg-error "must have identical shape" }
integer :: c(3) = unpack(a,[.false.,.true.,.false.],a) ! { dg-error "must have identical shape" }
print *, unpack(a,mask,a) ! { dg-error "must have identical shape" }
print *, unpack(a,mask,d) ! OK
print *, unpack(a,mask,3) ! OK
end