[Fortran,committed] Fix -fno-automatic string length static regression

Message ID 50D24968.4040507@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Dec. 19, 2012, 11:10 p.m.
The check whether the string length should be static or not with 
-fno-automatic failed to take automatic arrays into account. There are 
three possibilities for string lengths:

a) They can be constant
b) They can be based on a nonconstant expression
c) They can be deferred

(b) is an automatic variable; (a) and (c) might be static, but for (a) 
it doesn't matter whether the variable is static or not. Hence, only 
deferred-length variables have to be considered.

Approved by Paul on IRC and committed as Rev. 194621 after a successful 
bootstrap plus regtesting. A test case is, e.g., gfortran.dg/pr26246_2.f90.



Index: gcc/fortran/ChangeLog
--- gcc/fortran/ChangeLog	(Revision 194620)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,4 +1,10 @@ 
 2012-12-19  Tobias Burnus  <burnus@net-b.de>
+	PR fortran/55733
+	* trans-decl.c (gfc_create_string_length): Avoid setting
+	TREE_STATIC for automatic variables with -fno-automatic.
+2012-12-19  Tobias Burnus  <burnus@net-b.de>
 	    Jakub Jelinek  <jakub@redhat.com>
 	    Janus Weil  <janus@gcc.gnu.org>
Index: gcc/fortran/trans-decl.c
--- gcc/fortran/trans-decl.c	(Revision 194620)
+++ gcc/fortran/trans-decl.c	(Arbeitskopie)
@@ -1089,9 +1089,15 @@  gfc_create_string_length (gfc_symbol * sym)
       tree length;
       const char *name;
+      /* The string length variable shall be in static memory if it is either
+	 explicitly SAVED, a module variable or with -fno-automatic. Only
+	 relevant is "len=:" - otherwise, it is either a constant length or
+	 it is an automatic variable.  */
       bool static_length = sym->attr.save
 			   || sym->ns->proc_name->attr.flavor == FL_MODULE
-			   || gfc_option.flag_max_stack_var_size == 0;
+			   || (gfc_option.flag_max_stack_var_size == 0
+			       && sym->ts.deferred && !sym->attr.dummy
+			       && !sym->attr.result && !sym->attr.function);
       /* Also prefix the mangled name. We need to call GFC_PREFIX for static
 	 variables as some systems do not support the "." in the assembler name.