Bug 51800

Summary: [4.6/4.7 Regression] Error: Automatic array 'dummy' at (1) cannot have an initializer
Product: gcc Reporter: Mario Baumann <mario-baumann>
Component: fortranAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: burnus, jakub, toon
Priority: P4 Keywords: rejects-valid
Version: 4.7.0   
Target Milestone: 4.6.3   
Host: Target:
Build: Known to work: 4.6.2
Known to fail: 4.7.0 Last reconfirmed:
Attachments: fortran90 source file

Description Mario Baumann 2012-01-09 18:23:20 UTC
Created attachment 26282 [details]
fortran90 source file

Hi Gfortran Team,

compilation of the attached source file failed if using the both compiler options -fno-automatic and -finit-local-zero.

> gfortran -c -m32 -O0 -fno-automatic -finit-local-zero foo.f90
foo.f90:6.27:
      INTEGER :: DUMMY(1:N)
                           1
Error: Automatic array 'dummy' at (1) cannot have an initializer

It works fine if removing at least one of the both options above.

-------------------------------------------------------------------------------

> uname -a
Linux ahsoka.intec.dom 2.6.32-220.2.1.el6.x86_64 #1 SMP Tue Dec 13 16:21:34 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

> rpm -qa "glibc*" | grep -e 'glibc-[0-9]' | sort -u
glibc-2.12-1.47.el6.i686
glibc-2.12-1.47.el6.x86_64

> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/app2/gcc/4.7.0-20120109-svn183001/i686/libexec/gcc/i686-unknown-linux-gnu/4.7.0/lto-wrapper
Target: i686-unknown-linux-gnu
Configured with: ./configure --prefix=/app2/gcc/4.7.0-20120109-svn183001/i686 --enable-languages=c,c++,fortran --disable-nls --with-gmp=/app2/gcc/4.7.0-20120109-svn183001/i686/aux --with-mpfr=/app2/gcc/4.7.0-20120109-svn183001/i686/aux --with-mpc=/app2/gcc/4.7.0-20120109-svn183001/i686/aux --with-ppl=/app2/gcc/4.7.0-20120109-svn183001/i686/aux --with-cloog=/app2/gcc/4.7.0-20120109-svn183001/i686/aux --disable-multilib --build=i686-unknown-linux-gnu
Thread model: posix
gcc version 4.7.0 20120109 (experimental) (GCC) 

> ld -v
GNU ld (GNU Binutils) 2.22.51.20120109
Comment 1 Tobias Burnus 2012-01-09 18:34:52 UTC
I think that's due to the patch for PR 51310, i.e. the patches:
 [4.7]  http://gcc.gnu.org/ml/fortran/2011-12/msg00080.html
 [4.6]  http://gcc.gnu.org/ml/fortran/2011-12/msg00119.html

Toon, can you have a look?
Comment 2 Tobias Burnus 2012-01-11 15:03:42 UTC
Draft patch.

There is an additional issue for initialization of characters:

  subroutine sub(n)
    character(len=n) :: str

except that no initializer seems to be applied if the string length
is not known at compile time - otherwise, one had to handle it below
as well.

Index: resolve.c
===================================================================
--- resolve.c   (revision 183093)
+++ resolve.c   (working copy)
@@ -10172,7 +10172,8 @@ apply_default_init_local (gfc_symbol *sym)
   /* For saved variables, we don't want to add an initializer at
      function entry, so we just add a static initializer.  */
   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);
Comment 3 Tobias Burnus 2012-01-11 16:06:26 UTC
(In reply to comment #2)
> There is an additional issue for initialization of characters:
>   subroutine sub(n)
>     character(len=n) :: str

That was simpler that I had hoped for:

subroutine foo(n)
  character(len=n) :: str
  print *, str
end subroutine foo

call foo(3)
call foo(10)
end

$ gfortran -finit-character=89 test.f90 && ./a.out
 YYY
 YYYYYYYYYY


--- resolve.c   (revision 183093)
+++ resolve.c   (working copy)
@@ -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:
Comment 4 Tobias Burnus 2012-01-14 12:06:04 UTC
Author: burnus
Date: Sat Jan 14 12:05:59 2012
New Revision: 183180

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=183180
Log:
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.


Added:
    trunk/gcc/testsuite/gfortran.dg/init_flag_8.f90
    trunk/gcc/testsuite/gfortran.dg/init_flag_9.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/resolve.c
    trunk/gcc/testsuite/ChangeLog
Comment 5 Tobias Burnus 2012-01-14 13:28:10 UTC
Author: burnus
Date: Sat Jan 14 13:28:05 2012
New Revision: 183181

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=183181
Log:
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.


Added:
    branches/gcc-4_6-branch/gcc/testsuite/gfortran.dg/init_flag_8.f90
    branches/gcc-4_6-branch/gcc/testsuite/gfortran.dg/init_flag_9.f90
Modified:
    branches/gcc-4_6-branch/gcc/fortran/ChangeLog
    branches/gcc-4_6-branch/gcc/fortran/resolve.c
    branches/gcc-4_6-branch/gcc/testsuite/ChangeLog
Comment 6 Tobias Burnus 2012-01-14 13:28:58 UTC
FIXED on the trunk (4.7) and on the 4.6 branch.

Thanks Mario for the report!