aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.cc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2023-05-24 21:04:43 +0200
committerHarald Anlauf <anlauf@gmx.de>2023-05-24 21:51:02 +0200
commitec2e86274427a402d2de2199ba550f7295ea9b5f (patch)
treea44088e4ba18acde8d556987a9b38a025140ea1e /gcc/fortran/simplify.cc
parent5fd5d8fb744fd9251d04e4b17d04f2340e6a283b (diff)
downloadgcc-ec2e86274427a402d2de2199ba550f7295ea9b5f.zip
gcc-ec2e86274427a402d2de2199ba550f7295ea9b5f.tar.gz
gcc-ec2e86274427a402d2de2199ba550f7295ea9b5f.tar.bz2
Fortran: reject bad DIM argument of SIZE intrinsic in simplification [PR104350]
gcc/fortran/ChangeLog: PR fortran/104350 * simplify.cc (simplify_size): Reject DIM argument of intrinsic SIZE with error when out of valid range. gcc/testsuite/ChangeLog: PR fortran/104350 * gfortran.dg/size_dim_2.f90: New test.
Diffstat (limited to 'gcc/fortran/simplify.cc')
-rw-r--r--gcc/fortran/simplify.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc
index 3f77203..8168011 100644
--- a/gcc/fortran/simplify.cc
+++ b/gcc/fortran/simplify.cc
@@ -7594,7 +7594,17 @@ simplify_size (gfc_expr *array, gfc_expr *dim, int k)
if (dim->expr_type != EXPR_CONSTANT)
return NULL;
- d = mpz_get_ui (dim->value.integer) - 1;
+ if (array->rank == -1)
+ return NULL;
+
+ d = mpz_get_si (dim->value.integer) - 1;
+ if (d < 0 || d > array->rank - 1)
+ {
+ gfc_error ("DIM argument (%d) to intrinsic SIZE at %L out of range "
+ "(1:%d)", d+1, &array->where, array->rank);
+ return &gfc_bad_expr;
+ }
+
if (!gfc_array_dimen_size (array, d, &size))
return NULL;
}