aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-10-26 20:51:46 +0200
committerHarald Anlauf <anlauf@gmx.de>2021-10-26 20:51:46 +0200
commit99af0b2f0fe1c0dc8c6d558157e700326d52816a (patch)
tree529c76432524a22c6076c68c0cc2466f7b894045 /gcc/fortran/resolve.c
parentc9bf4d4354b942af00193924cb59c4c6ab9cc4b5 (diff)
downloadgcc-99af0b2f0fe1c0dc8c6d558157e700326d52816a.zip
gcc-99af0b2f0fe1c0dc8c6d558157e700326d52816a.tar.gz
gcc-99af0b2f0fe1c0dc8c6d558157e700326d52816a.tar.bz2
Fortran: error recovery on initializing invalid derived type array component
gcc/fortran/ChangeLog: PR fortran/102816 * resolve.c (resolve_structure_cons): Reject invalid array spec of a DT component referenced in a structure constructor. gcc/testsuite/ChangeLog: PR fortran/102816 * gfortran.dg/pr102816.f90: New test.
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5ccd907..af71b13 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1463,8 +1463,15 @@ resolve_structure_cons (gfc_expr *expr, int init)
mpz_init (len);
for (int n = 0; n < rank; n++)
{
- gcc_assert (comp->as->upper[n]->expr_type == EXPR_CONSTANT
- && comp->as->lower[n]->expr_type == EXPR_CONSTANT);
+ if (comp->as->upper[n]->expr_type != EXPR_CONSTANT
+ || comp->as->lower[n]->expr_type != EXPR_CONSTANT)
+ {
+ gfc_error ("Bad array spec of component %qs referenced in "
+ "structure constructor at %L",
+ comp->name, &cons->expr->where);
+ t = false;
+ break;
+ };
mpz_set_ui (len, 1);
mpz_add (len, len, comp->as->upper[n]->value.integer);
mpz_sub (len, len, comp->as->lower[n]->value.integer);