aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2018-01-27 11:28:20 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-27 11:28:20 +0100
commitaeb8c0283e0509b9f95ace57ed5b64813725aec0 (patch)
tree741892b11a86773573dd6be77f103182878589d2
parentd76ba10db121e71a7a668b40df259a2893086da3 (diff)
downloadgcc-aeb8c0283e0509b9f95ace57ed5b64813725aec0.zip
gcc-aeb8c0283e0509b9f95ace57ed5b64813725aec0.tar.gz
gcc-aeb8c0283e0509b9f95ace57ed5b64813725aec0.tar.bz2
re PR fortran/84065 (string_1.f90 fails since r256944)
PR fortran/84065 * decl.c (add_init_expr_to_sym): Ignore initializers for too large lengths. From-SVN: r257121
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/decl.c36
2 files changed, 31 insertions, 15 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9a2cc32..8660530 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,6 +1,12 @@
+2018-01-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/84065
+ * decl.c (add_init_expr_to_sym): Ignore initializers for too large
+ lengths.
+
2018-01-26 Damian Rouson <damian@sourceryinstitute.org>
- Alessandro Fanfarillo <fanfarillo.gcc@gmail.com>
- Soren Rasmussen <s.c.rasmussen@gmail.com>
+ Alessandro Fanfarillo <fanfarillo.gcc@gmail.com>
+ Soren Rasmussen <s.c.rasmussen@gmail.com>
Partial support for Fortran 2018 teams features.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 7922eef..307caa2 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1757,22 +1757,32 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
if (!gfc_specification_expr (sym->ts.u.cl->length))
return false;
- HOST_WIDE_INT len = gfc_mpz_get_hwi (sym->ts.u.cl->length->value.integer);
-
- if (init->expr_type == EXPR_CONSTANT)
- gfc_set_constant_character_len (len, init, -1);
- else if (init->expr_type == EXPR_ARRAY)
+ int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind,
+ false);
+ /* resolve_charlen will complain later on if the length
+ is too large. Just skeep the initialization in that case. */
+ if (mpz_cmp (sym->ts.u.cl->length->value.integer,
+ gfc_integer_kinds[k].huge) <= 0)
{
- gfc_constructor *c;
+ HOST_WIDE_INT len
+ = gfc_mpz_get_hwi (sym->ts.u.cl->length->value.integer);
+
+ if (init->expr_type == EXPR_CONSTANT)
+ gfc_set_constant_character_len (len, init, -1);
+ else if (init->expr_type == EXPR_ARRAY)
+ {
+ gfc_constructor *c;
- /* Build a new charlen to prevent simplification from
- deleting the length before it is resolved. */
- init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
- init->ts.u.cl->length = gfc_copy_expr (sym->ts.u.cl->length);
+ /* Build a new charlen to prevent simplification from
+ deleting the length before it is resolved. */
+ init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
+ init->ts.u.cl->length
+ = gfc_copy_expr (sym->ts.u.cl->length);
- for (c = gfc_constructor_first (init->value.constructor);
- c; c = gfc_constructor_next (c))
- gfc_set_constant_character_len (len, c->expr, -1);
+ for (c = gfc_constructor_first (init->value.constructor);
+ c; c = gfc_constructor_next (c))
+ gfc_set_constant_character_len (len, c->expr, -1);
+ }
}
}
}