From: Tobias Burnus Date: Sat, 14 Jan 2012 13:28:05 +0000 (+0100) Subject: re PR fortran/51800 (Error: Automatic array 'dummy' at (1) cannot have an initializer) X-Git-Tag: releases/gcc-4.6.3~177 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a9a8e5003d94d6d94706368495857572ab047bdb;p=thirdparty%2Fgcc.git re PR fortran/51800 (Error: Automatic array 'dummy' at (1) cannot have an initializer) 2012-01-14 Tobias Burnus PR fortran/51800 * resolve.c (build_default_init_expr): Also initialize nonconstant-length strings with -finit-character=. 2012-01-14 Tobias Burnus PR fortran/51800 * gfortran.dg/init_flag_8.f90: New. * gfortran.dg/init_flag_9.f90: New. From-SVN: r183181 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9a2d3fcda5a4..504b5cde1ffc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2012-01-14 Tobias Burnus + + Backported from mainline + 2012-01-14 Tobias Burnus + + PR fortran/51800 + * resolve.c (build_default_init_expr): Also initialize + nonconstant-length strings with -finit-character=. + 2012-01-01 Thomas König Backport from trunk diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 84753b242977..71615ab63f95 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -9814,6 +9814,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: @@ -9840,10 +9860,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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad17dc25c5d6..9cd2815d78d4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2012-01-14 Tobias Burnus + + Backported from mainline + 2012-01-14 Tobias Burnus + + PR fortran/51800 + * gfortran.dg/init_flag_8.f90: New. + * gfortran.dg/init_flag_9.f90: New. + 2012-01-12 Matthew Gretton-Dann Backport from mainline: @@ -12,7 +21,7 @@ 2012-01-09 Martin Jambor - PR tree-optimization/51759 + PR tree-optimization/51759 * g++.dg/ipa/pr51759.C: New test. 2012-01-09 Ramana Radhakrishnan diff --git a/gcc/testsuite/gfortran.dg/init_flag_8.f90 b/gcc/testsuite/gfortran.dg/init_flag_8.f90 new file mode 100644 index 000000000000..b3ccc03989d0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/init_flag_8.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! { dg-options "-fno-automatic -finit-local-zero" } +! +! PR fortran/51800 +! +! Contributed by Mario Baumann +! + SUBROUTINE FOO( N, A ) + IMPLICIT NONE + INTEGER :: N + INTEGER :: A(1:N) + INTEGER :: J + INTEGER :: DUMMY(1:N) + DO J=1,N + DUMMY(J) = 0 + A(J) = DUMMY(J) + END DO + END SUBROUTINE FOO diff --git a/gcc/testsuite/gfortran.dg/init_flag_9.f90 b/gcc/testsuite/gfortran.dg/init_flag_9.f90 new file mode 100644 index 000000000000..512396455bd0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/init_flag_9.f90 @@ -0,0 +1,15 @@ +! { dg-do run } +! { dg-options "-finit-character=89" } +! +! PR fortran/51800 +! + +subroutine foo(n) + character(len=n) :: str +! print *, str + if (str /= repeat ('Y', n)) call abort() +end subroutine foo + +call foo(3) +call foo(10) +end