summaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-01-14 13:05:59 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2012-01-14 13:05:59 +0100
commit068ed5e0e1d108c2f8be2ec1c1d1ec3757b68faa (patch)
tree50997e7300b321cc0e3089d7c56761ff75d584ba /gcc/fortran
parent74250065e2402e80c5b2a69e251104f67e8ebd10 (diff)
downloadgcc-068ed5e0e1d108c2f8be2ec1c1d1ec3757b68faa.tar.gz
re PR fortran/51800 (Error: Automatic array 'dummy' at (1) cannot have an initializer)
2012-01-14 Tobias Burnus <burnus@net-b.de> PR fortran/51800 * resolve.c (build_default_init_expr): Also initialize nonconstant-length strings with -finit-character=<n>. 2012-01-14 Tobias Burnus <burnus@net-b.de> PR fortran/51800 * gfortran.dg/init_flag_8.f90: New. * gfortran.dg/init_flag_9.f90: New. From-SVN: r183180
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c28
2 files changed, 31 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 95fa783da70..2ed3e4b04b7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-14 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/51800
+ * resolve.c (build_default_init_expr): Also initialize
+ nonconstant-length strings with -finit-character=<n>.
+
2011-01-14 Tobias Burnus <burnus@net-b.de>
PR fortran/51816
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 7f476b83400..352d22d0e01 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -10143,6 +10143,26 @@ build_default_init_expr (gfc_symbol *sym)
gfc_free_expr (init_expr);
init_expr = NULL;
}
+ if (!init_expr && gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
+ && sym->ts.u.cl->length)
+ {
+ gfc_actual_arglist *arg;
+ init_expr = gfc_get_expr ();
+ init_expr->where = sym->declared_at;
+ init_expr->ts = sym->ts;
+ init_expr->expr_type = EXPR_FUNCTION;
+ init_expr->value.function.isym =
+ gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT);
+ init_expr->value.function.name = "repeat";
+ arg = gfc_get_actual_arglist ();
+ arg->expr = gfc_get_character_expr (sym->ts.kind, &sym->declared_at,
+ NULL, 1);
+ arg->expr->value.character.string[0]
+ = gfc_option.flag_init_character_value;
+ arg->next = gfc_get_actual_arglist ();
+ arg->next->expr = gfc_copy_expr (sym->ts.u.cl->length);
+ init_expr->value.function.actual = arg;
+ }
break;
default:
@@ -10169,10 +10189,12 @@ apply_default_init_local (gfc_symbol *sym)
if (init == NULL)
return;
- /* For saved variables, we don't want to add an initializer at
- function entry, so we just add a static initializer. */
+ /* For saved variables, we don't want to add an initializer at function
+ entry, so we just add a static initializer. Note that automatic variables
+ are stack allocated even with -fno-automatic. */
if (sym->attr.save || sym->ns->save_all
- || gfc_option.flag_max_stack_var_size == 0)
+ || (gfc_option.flag_max_stack_var_size == 0
+ && (!sym->attr.dimension || !is_non_constant_shape_array (sym))))
{
/* Don't clobber an existing initializer! */
gcc_assert (sym->value == NULL);