diff options
author | Harald Anlauf <anlauf@gmx.de> | 2022-07-25 22:29:50 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-07-28 14:09:02 +0200 |
commit | cad8f2e62d6df769feea8ee30b507381764d18d1 (patch) | |
tree | f8a1464badb7238a06925c6d451f18a8c0703a3f /gcc/fortran | |
parent | eee84fda23eaac131f1efe4c9520e77f769371b4 (diff) | |
download | gcc-cad8f2e62d6df769feea8ee30b507381764d18d1.zip gcc-cad8f2e62d6df769feea8ee30b507381764d18d1.tar.gz gcc-cad8f2e62d6df769feea8ee30b507381764d18d1.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')
-rw-r--r-- | gcc/fortran/interface.cc | 7 |
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) |