Fortran: error recovery from calculation of storage size of a symbol [PR103504]
gcc/fortran/ChangeLog:
PR fortran/103504
* interface.cc (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
9be0feeade
commit
2009850b2b
|
@ -2792,7 +2792,8 @@ get_sym_storage_size (gfc_symbol *sym)
|
||||||
if (sym->ts.type == BT_CHARACTER)
|
if (sym->ts.type == BT_CHARACTER)
|
||||||
{
|
{
|
||||||
if (sym->ts.u.cl && sym->ts.u.cl->length
|
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);
|
strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2809,7 +2810,9 @@ get_sym_storage_size (gfc_symbol *sym)
|
||||||
for (i = 0; i < sym->as->rank; i++)
|
for (i = 0; i < sym->as->rank; i++)
|
||||||
{
|
{
|
||||||
if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
|
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;
|
return 0;
|
||||||
|
|
||||||
elements *= mpz_get_si (sym->as->upper[i]->value.integer)
|
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