Fortran: error recovery from calculation of storage size of a symbol [PR103504]

gcc/fortran/ChangeLog:

	PR fortran/103504
	* interface.c (get_sym_storage_size): Array bounds and character
	length can only be of integer type.

gcc/testsuite/ChangeLog:

	PR fortran/103504
	* gfortran.dg/pr103504.f90: New test.

(cherry picked from commit 600956c81c)
This commit is contained in:
Harald Anlauf 2022-07-25 22:29:50 +02:00
parent 42b5f41626
commit a872c61729
2 changed files with 33 additions and 2 deletions

View File

@ -2759,7 +2759,8 @@ get_sym_storage_size (gfc_symbol *sym)
if (sym->ts.type == BT_CHARACTER)
{
if (sym->ts.u.cl && sym->ts.u.cl->length
&& sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
&& sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
&& sym->ts.u.cl->length->ts.type == BT_INTEGER)
strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
else
return 0;
@ -2776,7 +2777,9 @@ get_sym_storage_size (gfc_symbol *sym)
for (i = 0; i < sym->as->rank; i++)
{
if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
|| sym->as->lower[i]->expr_type != EXPR_CONSTANT)
|| sym->as->lower[i]->expr_type != EXPR_CONSTANT
|| sym->as->upper[i]->ts.type != BT_INTEGER
|| sym->as->lower[i]->ts.type != BT_INTEGER)
return 0;
elements *= mpz_get_si (sym->as->upper[i]->value.integer)

View File

@ -0,0 +1,28 @@
! { dg-do compile }
! PR fortran/103504 - ICE in get_sym_storage_size, at fortran/interface.c:2800
! Contributed by G.Steinmetz
program p
implicit none
real :: y(1)
character :: b
call s(y)
call t(y)
call u(y)
call c(b)
contains
subroutine s(x)
real :: x(abs(1.):1) ! { dg-error "must be of INTEGER type" }
end
subroutine t(x)
real :: x(abs(1.):1) ! { dg-error "must be of INTEGER type" }
end
subroutine u(x)
real :: x(1:abs(1.)) ! { dg-error "must be of INTEGER type" }
end
subroutine c(z)
character(len=abs(1.)) :: z ! { dg-error "must be of INTEGER type" }
end subroutine c
end
! { dg-prune-output "must be of INTEGER type" }