aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/decl.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r--gcc/fortran/decl.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index e9b7651..584bb19 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1394,6 +1394,24 @@ build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
c->dimension = 1;
*as = NULL;
+ /* Should this ever get more complicated, combine with similar section
+ in add_init_expr_to_sym into a separate function. */
+ if (c->ts.type == BT_CHARACTER && !c->pointer && c->initializer)
+ {
+ int len = mpz_get_si (c->ts.cl->length->value.integer);
+
+ if (c->initializer->expr_type == EXPR_CONSTANT)
+ gfc_set_constant_character_len (len, c->initializer, false);
+ else if (mpz_cmp (c->ts.cl->length->value.integer,
+ c->initializer->ts.cl->length->value.integer))
+ {
+ gfc_constructor *ctor = c->initializer->value.constructor;
+ for (;ctor ; ctor = ctor->next)
+ if (ctor->expr->expr_type == EXPR_CONSTANT)
+ gfc_set_constant_character_len (len, ctor->expr, true);
+ }
+ }
+
/* Check array components. */
if (!c->dimension)
{