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:
parent
42b5f41626
commit
a872c61729
|
@ -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)
|
||||
|
|
|
@ -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" }
|
Loading…
Reference in New Issue