Patchwork [Fortran] PR50619 - fix ASSOCIATE with -finit-*

login
register
mail settings
Submitter Tobias Burnus
Date June 4, 2012, 4:03 p.m.
Message ID <4FCCDC50.7050600@net-b.de>
Download mbox | patch
Permalink /patch/162834/
State New
Headers show

Comments

Tobias Burnus - June 4, 2012, 4:03 p.m.
First, I would like to ping my move_alloc coarray patches. The handling 
is in line with the J3-approved interpretation request F08/0040 with 
some remarks of the WG5 convenor (John Reid), cf. PR for the links:
- http://gcc.gnu.org/ml/fortran/2012-05/msg00171.html
- http://gcc.gnu.org/ml/fortran/2012-05/msg00173.html

  * * *

ASSOCIATE names are (wrongly) initialized by -finit-real=*, thus, their 
values are wrong.

The fix seems to be rather obvious, but I am not really an associate expert.

Build and regtested on x86-64-linux.
OK for the trunk? How about backporting? It's not a regression and it 
requires a nondefault flag; on the other hand, it can be rather 
suprising wrong-code bug and the fix is simple.

Tobias
Thomas Koenig - June 4, 2012, 8:35 p.m.
Hi Tobias,

> ASSOCIATE names are (wrongly) initialized by -finit-real=*, thus, their
> values are wrong.
>
> The fix seems to be rather obvious, but I am not really an associate
> expert.

I'd say it is obvious. OK for trunk, also OK for backporting.
I am unsure whether to put it into 4.7.1, though. Opinions?

Regards

	Thomas

Patch

2012-06-04  Tobias Burnus  <burnus@net-b.de>

	PR fortran/50619
	* resolve.c (build_default_init_expr): Don't initialize
	ASSOCIATE names.

2012-06-04  Tobias Burnus  <burnus@net-b.de>

	PR fortran/50619
	* gfortran.dg/init_flag_10.f90: New.

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 3627b71..61a1381 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -10103,7 +10103,8 @@  build_default_init_expr (gfc_symbol *sym)
       || sym->attr.data
       || sym->module
       || sym->attr.cray_pointee
-      || sym->attr.cray_pointer)
+      || sym->attr.cray_pointer
+      || sym->assoc)
     return NULL;
 
   /* Now we'll try to build an initializer expression.  */
--- /dev/null	2012-06-04 08:06:14.603785028 +0200
+++ gcc/gcc/testsuite/gfortran.dg/init_flag_10.f90	2012-06-04 14:42:30.000000000 +0200
@@ -0,0 +1,43 @@ 
+! { dg-do run }
+! { dg-options "-finit-real=NAN" }
+! { dg-add-options ieee }
+! { dg-skip-if "NaN not supported" { spu-*-* } { "*" } { "" } }
+!
+! PR fortran/50619
+!
+! Contributed by Fred Krogh
+!
+! The NaN initialization used to set the associate name to NaN!
+!
+
+module testa2
+type, public ::  test_ty
+  real :: rmult = 1.0e0
+end type test_ty
+
+contains
+  subroutine test(e, var1)
+    type(test_ty) :: e
+    real :: var1, var2 ! Should get NaN initialized
+
+    ! Should be the default value
+    if (e%rmult /= 1.0) call abort ()
+
+    ! Check that NaN initialization is really turned on
+    if (var1 == var1) call abort () 
+    if (var2 == var2) call abort () 
+
+    ! The following was failing:
+    associate (rmult=>e%rmult)
+      if (e%rmult /= 1.0) call abort ()
+    end associate
+  end subroutine test
+end module testa2
+
+program testa1
+  use testa2
+  type(test_ty) :: e
+  real :: var1 ! Should get NaN initialized
+  call test(e, var1)
+  stop
+end program testa1