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