[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