[gcc/devel/c++-modules] PR libfortran/95195 - improve runtime error for namelist i/o to unformatted file

Nathan Sidwell nathan@gcc.gnu.org
Wed Jun 10 16:47:22 GMT 2020


https://gcc.gnu.org/g:8d8a25b0a7c3400c724e04e1d775d9f377216c04

commit 8d8a25b0a7c3400c724e04e1d775d9f377216c04
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Tue May 26 21:21:19 2020 +0200

    PR libfortran/95195 - improve runtime error for namelist i/o to unformatted file
    
    Namelist input/output to unformatted files is prohibited.
    Generate useful runtime errors instead instead of misleading ones.
    
    2020-05-26  Harald Anlauf  <anlauf@gmx.de>
    
    libgfortran/
            PR fortran/95195
            * io/transfer.c (finalize_transfer): Generate runtime error for
            namelist input/output to unformatted file.
    
    gcc/testsuite/
            PR fortran/95195
            * gfortran.dg/namelist_97.f90: New test.

Diff:
---
 gcc/testsuite/gfortran.dg/namelist_97.f90 | 14 ++++++++++++++
 libgfortran/io/transfer.c                 |  8 ++++++++
 2 files changed, 22 insertions(+)

diff --git a/gcc/testsuite/gfortran.dg/namelist_97.f90 b/gcc/testsuite/gfortran.dg/namelist_97.f90
new file mode 100644
index 00000000000..4907e46b46a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/namelist_97.f90
@@ -0,0 +1,14 @@
+! { dg-do run }
+! { dg-output "At line 12 .*" }
+! { dg-shouldfail "Fortran runtime error: Namelist formatting .* FORM='UNFORMATTED'" }
+!
+! PR95195 - improve runtime error when writing a namelist to an unformatted file
+
+program test
+  character(len=11) :: my_form = 'unformatted'
+  integer           :: i = 1, j = 2, k = 3
+  namelist /nml1/ i, j, k
+  open  (unit=10, file='test.dat', form=my_form)
+  write (unit=10, nml=nml1)
+  close (unit=10, status='delete')
+end program test
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index b8db47dbff9..d071c1ce915 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -4123,6 +4123,14 @@ finalize_transfer (st_parameter_dt *dtp)
   if ((dtp->u.p.ionml != NULL)
       && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
     {
+       if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
+	 {
+	   generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
+			   "Namelist formatting for unit connected "
+			   "with FORM='UNFORMATTED");
+	   return;
+	 }
+
        dtp->u.p.namelist_mode = 1;
        if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
 	 namelist_read (dtp);


More information about the Gcc-cvs mailing list