On Fri, Oct 18, 2019 at 05:17:38PM +0100, Iain Sandoe wrote:
> 
> something like this, perhaps (I regret my Fortran skills are in the f77 era):
> 

If you know/knew F77 and have some working knowledge of C/C++ and
you want to see where modern Fortran sits, I recommend Modern Fortran
Explained iby Metcalf et al.  You can probably read it in a day.

For the record, here is the patch (see attached) committed to all
open branches.

With this commit, I'll be taking a long break from looking at
any gfortran bugs.

2019-10-18  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/69455
        * trans-decl.c (generate_local_decl): Avoid misconstructed
        intrinsic modules in a BLOCK construct.

2019-10-18  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/69455
        * gfortran.dg/pr69455_1.f90: New test.
        * gfortran.dg/pr69455_2.f90: Ditto.

-- 
Steve
25.16%
Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c	(revision 277157)
+++ gcc/fortran/trans-decl.c	(working copy)
@@ -5962,7 +5962,14 @@ generate_local_decl (gfc_symbol * sym)
 
       if (sym->ns && sym->ns->construct_entities)
 	{
-	  if (sym->attr.referenced)
+	  /* Construction of the intrinsic modules within a BLOCK
+	     construct, where ONLY and RENAMED entities are included,
+	     seems to be bogus.  This is a workaround that can be removed
+	     if someone ever takes on the task to creating full-fledge
+	     modules.  See PR 69455.  */
+	  if (sym->attr.referenced
+	      && sym->from_intmod != INTMOD_ISO_C_BINDING
+	      && sym->from_intmod != INTMOD_ISO_FORTRAN_ENV)
 	    gfc_get_symbol_decl (sym);
 	  sym->mark = 1;
 	}
Index: gcc/testsuite/gfortran.dg/pr69455_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr69455_1.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr69455_1.f90	(working copy)
@@ -0,0 +1,14 @@
+! { dg-do run }
+program foo
+   block
+      use, intrinsic :: iso_c_binding, only: wp => c_float, ik => c_int
+      if (ik /= 4) stop 1
+      if (wp /= 4) stop 2
+   end block
+   block
+      use, intrinsic :: iso_c_binding, only: wp => c_double, ik => c_int64_t
+      if (ik /= 8) stop 3
+      if (wp /= 8) stop 4
+   end block
+end program foo
+
Index: gcc/testsuite/gfortran.dg/pr69455_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr69455_2.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr69455_2.f90	(working copy)
@@ -0,0 +1,13 @@
+! { dg-do run }
+program foo
+   block
+      use, intrinsic :: ISO_FORTRAN_ENV, only: wp => REAL32, ik => INT32
+      if (ik /= 4) stop 1
+      if (wp /= 4) stop 2
+   end block
+   block
+      use, intrinsic :: ISO_FORTRAN_ENV, only: wp => REAL64, ik => INT64
+      if (ik /= 8) stop 3
+      if (wp /= 8) stop 4
+   end block
+end program foo

Reply via email to