aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/interface.cc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2022-07-25 22:29:50 +0200
committerHarald Anlauf <anlauf@gmx.de>2022-07-26 19:05:05 +0200
commit600956c81c784f4a0cc9d10f6e03e01847afd961 (patch)
tree7d4f5f819bcd8356560c4a8fd8f9f121f6611ecf /gcc/fortran/interface.cc
parent975658b782f36dcf6eb190966d5b705977bfd5eb (diff)
downloadgcc-600956c81c784f4a0cc9d10f6e03e01847afd961.zip
gcc-600956c81c784f4a0cc9d10f6e03e01847afd961.tar.gz
gcc-600956c81c784f4a0cc9d10f6e03e01847afd961.tar.bz2
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.
Diffstat (limited to 'gcc/fortran/interface.cc')
-rw-r--r--gcc/fortran/interface.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc
index 7ed6e13..71eec78 100644
--- a/gcc/fortran/interface.cc
+++ b/gcc/fortran/interface.cc
@@ -2792,7 +2792,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;
@@ -2809,7 +2810,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)