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.
This commit is contained in:
Harald Anlauf 2020-05-26 21:21:19 +02:00
parent 73655feb9d
commit 8d8a25b0a7
2 changed files with 22 additions and 0 deletions

View File

@ -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

View File

@ -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);