diff options
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 18 |
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) { |