]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/51800 (Error: Automatic array 'dummy' at (1) cannot have an initializer)
authorTobias Burnus <burnus@gcc.gnu.org>
Sat, 14 Jan 2012 13:28:05 +0000 (14:28 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Sat, 14 Jan 2012 13:28:05 +0000 (14:28 +0100)
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: r183181

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/init_flag_8.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/init_flag_9.f90 [new file with mode: 0644]

index 9a2d3fcda5a45eb67981b0efe7e967dc0622890b..504b5cde1ffc3624ab61c319d9426f1e753ddc49 100644 (file)
@@ -1,3 +1,12 @@
+2012-01-14  Tobias Burnus  <burnus@net-b.de>
+
+       Backported from mainline
+       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-01  Thomas König  <tkoenig@gcc.gnu.org>
 
        Backport from trunk
index 84753b2429772521f2f9c32d4181972ea6d529ab..71615ab63f95aa37c4332004b2b17eb16d91bd92 100644 (file)
@@ -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);
index ad17dc25c5d696113e4238b07de942406d676fac..9cd2815d78d4a72cfd2f4bebe16a4c7af5027a1d 100644 (file)
@@ -1,3 +1,12 @@
+2012-01-14  Tobias Burnus  <burnus@net-b.de>
+
+       Backported from mainline
+       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.
+
 2012-01-12  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
 
        Backport from mainline:
@@ -12,7 +21,7 @@
 
 2012-01-09  Martin Jambor  <mjambor@suse.cz>
 
-        PR tree-optimization/51759
+       PR tree-optimization/51759
        * g++.dg/ipa/pr51759.C: New test.
 
 2012-01-09  Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>
diff --git a/gcc/testsuite/gfortran.dg/init_flag_8.f90 b/gcc/testsuite/gfortran.dg/init_flag_8.f90
new file mode 100644 (file)
index 0000000..b3ccc03
--- /dev/null
@@ -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 (file)
index 0000000..5123964
--- /dev/null
@@ -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