--- /dev/null
+! ( dg-do run }
+program pr88776
+ implicit none
+ character(*), parameter :: file = "pr88776.dat"
+ type t_chan
+ integer :: ichan = -1
+ character(len=8) :: flag = ''
+ integer :: band = -1
+ end type t_chan
+ type(t_chan) :: chan
+ namelist /NML/ chan
+ open (11,file=file)
+ write(11,'(a)') trim("&nml chan = 1 '#1 ' 10 /")
+ write(11,'(a)') trim("&nml chan = 2 '#2 ' 42.36/")
+ write(11,'(a)') trim("&nml chan = 3 '#3 ' 30 /")
+ close(11)
+ call read (unit=10) ! No problem
+ call read (unit=5) ! problem, now fixed
+ open (11,file=file)
+ close (11, status="delete")
+contains
+ subroutine read (unit)
+ integer, intent(in) :: unit
+ integer :: stat
+ open (unit, file=file, action="read")
+ chan = t_chan(-1,'',-1)
+ stat = 0
+ read (unit, nml=NML, iostat=stat)
+ if (stat /= 0) stop 1
+ chan = t_chan(-1,'',-1)
+ read (unit, nml=NML, iostat=stat)
+ if (stat == 0) stop 2
+ if (chan% ichan /= 2) then
+ stop 3
+ end if
+ close (unit)
+ end subroutine read
+end program pr88776
+2019-01-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libfortran/88776
+ * io/open.c (newunit): Free format buffer if the unit specified is for
+ stdin, stdout, or stderr.
+
2019-01-12 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/88776
if (u2 != NULL)
unlock_unit (u2);
+ /* If the unit specified is preconnected with a file specified to be open,
+ then clear the format buffer. */
+ if ((opp->common.unit == options.stdin_unit ||
+ opp->common.unit == options.stdout_unit ||
+ opp->common.unit == options.stderr_unit)
+ && (opp->common.flags & IOPARM_OPEN_HAS_FILE) != 0)
+ fbuf_destroy (u);
+
/* Open file. */
s = open_external (opp, flags);
if (u->filename && u->flags.status == STATUS_SCRATCH)
remove (u->filename);
#endif
- free (u->filename);
- u->filename = NULL;
-
+ free (u->filename);
+ u->filename = NULL;
+
u = new_unit (opp, u, flags);
if (u != NULL)
- unlock_unit (u);
+ unlock_unit (u);
return;
}