+2017-05-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/80741
+ * trans-io.c (transfer_namelist_element): Change check from
+ NULL_TREE to null_pointer_node.
+
2017-05-17 Fritz Reese <fritzoreese@gmail.com>
PR fortran/80668
else
tmp = build_int_cst (gfc_charlen_type_node, 0);
- if (dtio_proc == NULL_TREE)
+ if (dtio_proc == null_pointer_node)
tmp = build_call_expr_loc (input_location,
iocall[IOCALL_SET_NML_VAL], 6,
dt_parm_addr, addr_expr, string,
--- /dev/null
+! { dg-do run }
+! PR80741 wrong code causes incorrect behaviour of namelist READ
+program p
+ use, intrinsic :: iso_fortran_env, only: iostat_end
+ implicit none
+ integer :: x, y, ios, io
+ character(10) :: line
+ namelist /test/ x, y
+
+ x = 10
+ y = 10
+ ios = 0
+ io = 10
+ open(unit=io, status='scratch')
+ write(io, test)
+ write(io, *) 'done'
+ rewind(io)
+ x = 0
+ y = 0
+ read(io, test)
+ if (x.ne.10 .or. y.ne.10) call abort
+ !
+ read(io, *) line
+ if (line.ne.'done') call abort
+ !
+ read(io, *, iostat=ios) line
+ if (ios/=iostat_end) call abort
+ rewind(io)
+ x = 0
+ y = 0
+ read(io, test)
+ if (x.ne.10 .or. y.ne.10) call abort
+ read(io, *, iostat=ios) line
+ if (line.ne.'done') call abort
+end
+2017-05-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libgfortran/80741
+ * transfer.c (finalize_transfer): Reset last_char to 'empty'.
+ * file_pos.c (formatted_backspace): Likewise.
+ (st_endfile): Likewise.
+ (st_rewind): Likewise.
+ (st_flush): Likewise.
+
2017-05-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/80727
goto io_error;
u->last_record--;
u->endfile = NO_ENDFILE;
-
+ u->last_char = EOF - 1;
return;
io_error:
unit_truncate (u, stell (u->s), &fpp->common);
u->endfile = AFTER_ENDFILE;
+ u->last_char = EOF - 1;
if (0 == stell (u->s))
u->flags.position = POSITION_REWIND;
}
if (u == NULL)
return;
u->endfile = AFTER_ENDFILE;
+ u->last_char = EOF - 1;
}
}
u->current_record = 0;
u->strm_pos = 1;
u->read_bad = 0;
+ u->last_char = EOF - 1;
}
/* Update position for INQUIRE. */
u->flags.position = POSITION_REWIND;
fbuf_flush (u, u->mode);
sflush (u->s);
+ u->last_char = EOF - 1;
unlock_unit (u);
}
else
fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
dtp->u.p.current_unit->saved_pos = 0;
-
+ dtp->u.p.current_unit->last_char = EOF - 1;
next_record (dtp, 1);
done: