For some reasons, result variables are walked twice. With
-finit-local-zero their value gets set to 0, either via an inserted
assignment or by adding a initialization (sym->value).
With -fno-automatic sym->value is also set for result variables, which
later leads to an error. With the patch, that code path is skipped and
an assignment is done. (As the code path is taken twice, twp assignments
are done. I couldn't quickly see why the result variable is resolved twice.)
Build and regtested on x86-64-linux.
OK for the trunk?
Tobias
2012-07-02 Tobias Burnus <bur...@net-b.de>
PR fortran/53818
* resolve.c (apply_default_init_local): Don't create an
initializer for a result variable.
2012-07-02 Tobias Burnus <bur...@net-b.de>
PR fortran/53818
* gfortran.dg/init_flag_11.f90: New.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 0434e08..c7f14a2 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -10269,7 +10328,7 @@ apply_default_init_local (gfc_symbol *sym)
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.result
&& (!sym->attr.dimension || !is_non_constant_shape_array (sym))))
{
/* Don't clobber an existing initializer! */
--- /dev/null 2012-06-30 08:05:14.091716208 +0200
+++ gcc/gcc/testsuite/gfortran.dg/init_flag_11.f90 2012-07-02 08:58:54.000000000 +0200
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-flags "-finit-local-zero -fno-automatic"
+!
+! PR fortran/53818
+!
+! Contributed by John Moyard
+!
+logical function testing(date1, date2) result(test)
+ integer date1, date2
+ test = ( (date1 < date2) .or. ( date1==date2 ))
+end function testing