diff options
author | Harald Anlauf <anlauf@gmx.de> | 2022-06-20 20:59:55 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2022-06-26 22:01:49 +0200 |
commit | a312407bd715647f7c11b67e0a52effc94d0f15d (patch) | |
tree | 959a183bd9b7a040e8410e88798bdacbacbd7b72 /gcc/fortran/decl.cc | |
parent | ff01849dccd4355ac6491c04eff8b2e39ecee70e (diff) | |
download | gcc-a312407bd715647f7c11b67e0a52effc94d0f15d.zip gcc-a312407bd715647f7c11b67e0a52effc94d0f15d.tar.gz gcc-a312407bd715647f7c11b67e0a52effc94d0f15d.tar.bz2 |
Fortran: handle explicit-shape specs with constant bounds [PR105954]
gcc/fortran/ChangeLog:
PR fortran/105954
* decl.cc (variable_decl): Adjust upper bounds for explicit-shape
specs with constant bound expressions to ensure non-negative
extents.
gcc/testsuite/ChangeLog:
PR fortran/105954
* gfortran.dg/pr105954.f90: New test.
Diffstat (limited to 'gcc/fortran/decl.cc')
-rw-r--r-- | gcc/fortran/decl.cc | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index bd586e7..26ff54d 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -2775,6 +2775,18 @@ variable_decl (int elem) else gfc_free_expr (n); } + /* For an explicit-shape spec with constant bounds, ensure + that the effective upper bound is not lower than the + respective lower bound minus one. Otherwise adjust it so + that the extent is trivially derived to be zero. */ + if (as->lower[i]->expr_type == EXPR_CONSTANT + && as->upper[i]->expr_type == EXPR_CONSTANT + && as->lower[i]->ts.type == BT_INTEGER + && as->upper[i]->ts.type == BT_INTEGER + && mpz_cmp (as->upper[i]->value.integer, + as->lower[i]->value.integer) < 0) + mpz_sub_ui (as->upper[i]->value.integer, + as->lower[i]->value.integer, 1); } } } |