This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix Fortran -fno-automatic and save_all (PR fortran/23677) (take 2)


On Mon, Sep 26, 2005 at 10:58:01AM +0200, Tobias Schl?ter wrote:
> Jakub Jelinek wrote:
> > This patch fixes 2 problems:
> > 1) SAVE all would not save constant length CHARACTER variables,
> >    but unexpectedly non-constant length CHARACTER variables
> >    (gfortran.fortran-torture/execute/save_1.f90 test passes
> >    with g77, but fails with gfortran unless this patch is applied)
> > 2) -fno-automatic would issue errors if some variable had explicit
> >    SAVE already.  g77 silently compiled it, so I think we should
> >    do the same.
> > Ok for HEAD/4.0?
> 
> Your work might be relevant for PR 19425, which is an enhancement request.  As
> noted in PR 23677 -fno-automatic should really be a synonym for
> -fmax-stack-var-size=0, that way the duplicate save problem wouldn't occur.

So you prefer something like this instead?
If yes, ok for HEAD/4.0?

2005-09-26  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/23677
	* symbol.c (gfc_is_var_automatic): Return true if character length
	is non-constant rather than constant.
	* resolve.c (gfc_resolve): Don't handle !gfc_option.flag_automatic
	here.
	* options.c (gfc_post_options): Set gfc_option.flag_max_stack_var_size
	to 0 for -fno-automatic.

	* gfortran.fortran-torture/execute/save_1.f90: New test.
	* gfortran.dg/save_1.f90: New test.

--- gcc/fortran/options.c.jj	2005-09-13 11:08:40.000000000 +0200
+++ gcc/fortran/options.c	2005-09-26 16:25:02.000000000 +0200
@@ -223,6 +223,10 @@ gfc_post_options (const char **pfilename
   if (gfc_option.flag_second_underscore == -1)
     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
 
+  /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
+  if (!gfc_option.flag_automatic)
+    gfc_option.flag_max_stack_var_size = 0;
+
   return false;
 }
 
--- gcc/fortran/symbol.c.jj	2005-09-19 22:45:54.000000000 +0200
+++ gcc/fortran/symbol.c	2005-09-26 16:15:35.000000000 +0200
@@ -2345,7 +2345,7 @@ gfc_is_var_automatic (gfc_symbol * sym)
   /* Check for non-constant length character variables.  */
   if (sym->ts.type == BT_CHARACTER
       && sym->ts.cl
-      && gfc_is_constant_expr (sym->ts.cl->length))
+      && !gfc_is_constant_expr (sym->ts.cl->length))
     return true;
   return false;
 }
--- gcc/fortran/resolve.c.jj	2005-09-26 08:39:40.000000000 +0200
+++ gcc/fortran/resolve.c	2005-09-26 16:15:58.000000000 +0200
@@ -5107,7 +5107,7 @@ gfc_resolve (gfc_namespace * ns)
 
   gfc_traverse_ns (ns, resolve_values);
 
-  if (!gfc_option.flag_automatic || ns->save_all)
+  if (ns->save_all)
     gfc_save_all (ns);
 
   iter_stack = NULL;
--- gcc/testsuite/gfortran.dg/save_1.f90.jj	2005-09-26 09:20:34.000000000 +0200
+++ gcc/testsuite/gfortran.dg/save_1.f90	2005-09-26 09:22:23.000000000 +0200
@@ -0,0 +1,30 @@
+! { dg-options "-O2 -fno-automatic" }
+      subroutine foo (b)
+	logical b
+	integer i, j
+	character*24 s
+	save i
+	if (b) then
+	  i = 26
+	  j = 131
+	  s = 'This is a test string'
+	else
+	  if (i .ne. 26 .or. j .ne. 131) call abort
+	  if (s .ne. 'This is a test string') call abort
+	end if
+      end subroutine foo
+      subroutine bar (s)
+	character*42 s
+	if (s .ne. '0123456789012345678901234567890123456') call abort
+	call foo (.false.)
+      end subroutine bar
+      subroutine baz
+	character*42 s
+	! Just clobber stack a little bit.
+	s = '0123456789012345678901234567890123456'
+	call bar (s)
+      end subroutine baz
+      call foo (.true.)
+      call baz
+      call foo (.false.)
+      end
--- gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90.jj	2005-09-26 09:19:56.000000000 +0200
+++ gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90	2005-09-26 09:21:36.000000000 +0200
@@ -0,0 +1,29 @@
+      subroutine foo (b)
+	logical b
+	integer i, j
+	character*24 s
+	save
+	if (b) then
+	  i = 26
+	  j = 131
+	  s = 'This is a test string'
+	else
+	  if (i .ne. 26 .or. j .ne. 131) call abort
+	  if (s .ne. 'This is a test string') call abort
+	end if
+      end subroutine foo
+      subroutine bar (s)
+	character*42 s
+	if (s .ne. '0123456789012345678901234567890123456') call abort
+	call foo (.false.)
+      end subroutine bar
+      subroutine baz
+	character*42 s
+	! Just clobber stack a little bit.
+	s = '0123456789012345678901234567890123456'
+	call bar (s)
+      end subroutine baz
+      call foo (.true.)
+      call baz
+      call foo (.false.)
+      end


	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]