Bug 42267 - interaction between -finit-local-zero and -fno-automatic
Summary: interaction between -finit-local-zero and -fno-automatic
Status: RESOLVED DUPLICATE of bug 41860
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.4.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-12-03 19:13 UTC by Bud Davis
Modified: 2009-12-03 21:19 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.5.0
Known to fail: 4.3.4 4.4.2
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Bud Davis 2009-12-03 19:13:57 UTC
when using both flags, the variables are initialized on every function call.  see the example below:


bash-3.2$ cat lvar.f 
       REAL A(100)
       PRINT*,'Expect them to be zero'
       CALL ONE
       PRINT*,'Expect them to be 1..10'
       CALL TWO
       PRINT*,'Expect them to be 1..10'
       CALL ONE
       END
       SUBROUTINE ONE
       REAL A(100)
       INTEGER I
       PRINT*,"Sub One Loc(a) is ",LOC(A)
       DO I=1,10
          PRINT*,A(I)
          A(I) = I
       END DO
       END
       SUBROUTINE TWO
       REAL A(100)
       INTEGER I
       PRINT*,"Sub Two Loc(a) is ",LOC(A)
       DO I = 1,10
         A(I) = 0
       END DO
       END
bash-3.2$ /usr/local/bin/gfortran -static lvar.f -finit-local-zero -fno-automatic
bash-3.2$  /usr/local/bin/gfortran --version
GNU Fortran (GCC) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

bash-3.2$ ./a.out
 Expect them to be zero
 Sub One Loc(a) is    135144832
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
 Expect them to be 1..10
 Sub Two Loc(a) is    135144416
 Expect them to be 1..10
 Sub One Loc(a) is    135144832
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000    
   0.0000000
Comment 1 Bud Davis 2009-12-03 19:16:14 UTC
here is a patch against 4.4.1





diff --context --recursive gcc-4.4.1/gcc/fortran/gfortran.h gcc-4.4.1_bud/gcc/fortran/gfortran.h
*** gcc-4.4.1/gcc/fortran/gfortran.h    2009-02-21 16:25:06.000000000 -0600
--- gcc-4.4.1_bud/gcc/fortran/gfortran.h        2009-12-03 09:24:11.000000000 -0600
***************
*** 2024,2029 ****
--- 2024,2030 ----
    int flag_init_character;
    char flag_init_character_value;
    int flag_align_commons;
+   int flag_no_automatic;
  
    int fpe;
  
diff --context --recursive gcc-4.4.1/gcc/fortran/options.c gcc-4.4.1_bud/gcc/fortran/options.c
*** gcc-4.4.1/gcc/fortran/options.c     2008-11-03 01:20:24.000000000 -0600
--- gcc-4.4.1_bud/gcc/fortran/options.c 2009-12-03 09:24:54.000000000 -0600
***************
*** 346,352 ****
  
    /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
    if (!gfc_option.flag_automatic)
!     gfc_option.flag_max_stack_var_size = 0;
    
    if (pedantic)
      { 
--- 346,355 ----
  
    /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
    if (!gfc_option.flag_automatic)
!     {
!       gfc_option.flag_no_automatic = 1;
!       gfc_option.flag_max_stack_var_size = 0;
!     }
    
    if (pedantic)
      { 
diff --context --recursive gcc-4.4.1/gcc/fortran/resolve.c gcc-4.4.1_bud/gcc/fortran/resolve.c
*** gcc-4.4.1/gcc/fortran/resolve.c     2009-06-20 04:21:06.000000000 -0500
--- gcc-4.4.1_bud/gcc/fortran/resolve.c 2009-12-03 09:49:52.000000000 -0600
***************
*** 7486,7492 ****
  
    /* 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)
      {
        /* Don't clobber an existing initializer!  */
        gcc_assert (sym->value == NULL);
--- 7486,7492 ----
  
    /* 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_no_automatic )
      {
        /* Don't clobber an existing initializer!  */
        gcc_assert (sym->value == NULL);
Comment 2 Tobias Burnus 2009-12-03 20:06:07 UTC
That's already fixed for 4.5.0, see PR 41860. Do you think it makes sense to backport the patch to 4.4.x? (Note: 4.5.0 is currently in Stage4 (regression fixes only) - thus the question is how many fixed 4.4.x would be used.)
Comment 3 Bud Davis 2009-12-03 20:21:02 UTC
silly me.  glad to see we both fixed it the same way :)

close with no more action taken ?


--bud


Comment 4 Tobias Burnus 2009-12-03 20:47:19 UTC
(In reply to comment #3)
> silly me.  glad to see we both fixed it the same way :)
> close with no more action taken ?

I am fine with closing it as won't fix, but one could also mark it as duplicate. (Or backport the fix and keep it open.)
Comment 5 Richard Biener 2009-12-03 21:14:39 UTC
If it's not a regression close it as fixed in 4.5.
Comment 6 Tobias Burnus 2009-12-03 21:19:19 UTC

*** This bug has been marked as a duplicate of 41860 ***