From 8b393e9fb21ee2889eb341ec20e6e84e6f4de2a5 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Thu, 13 Sep 2018 18:42:16 +0000 Subject: [PATCH] trans-array.c (gfc_conv_array_initializer): Remove excess precision from overlength string initializers. * trans-array.c (gfc_conv_array_initializer): Remove excess precision from overlength string initializers. From-SVN: r264285 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/trans-array.c | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6249996ccbc..becc184828c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2018-09-13 Bernd Edlinger + + * trans-array.c (gfc_conv_array_initializer): Remove excess precision + from overlength string initializers. + 2018-09-12 Paul Thomas PR fortran/87284 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index adb2c0575a8..473bfc5419b 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -5956,6 +5956,26 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) { case EXPR_CONSTANT: gfc_conv_constant (&se, c->expr); + + /* See gfortran.dg/charlen_15.f90 for instance. */ + if (TREE_CODE (se.expr) == STRING_CST + && TREE_CODE (type) == ARRAY_TYPE) + { + tree atype = type; + while (TREE_CODE (TREE_TYPE (atype)) == ARRAY_TYPE) + atype = TREE_TYPE (atype); + if (TREE_CODE (TREE_TYPE (atype)) == INTEGER_TYPE + && tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (se.expr))) + > tree_to_uhwi (TYPE_SIZE_UNIT (atype))) + { + unsigned HOST_WIDE_INT size + = tree_to_uhwi (TYPE_SIZE_UNIT (atype)); + const char *p = TREE_STRING_POINTER (se.expr); + + se.expr = build_string (size, p); + TREE_TYPE (se.expr) = atype; + } + } break; case EXPR_STRUCTURE: -- 2.30.2