Re: [Patch, Fortran, 4.8/4.9/5 Regression] PR59513 READ or WRITE not allowed after EOF
Dear Jerry, IMO the patch is in the obvious range, but needs to document the extension and may be a test case. Cheers, Dominique
Re: [Patch, Fortran, 4.8/4.9/5 Regression] PR59513 READ or WRITE not allowed after EOF
On Sat, Mar 21, 2015 at 12:24 AM, Jerry DeLisle jvdeli...@charter.net wrote: The attached patch allows the attempt to READ or WRITE after an EOF for legacy code. The runtime error is suppressed for -std=legacy and -std=gnu. For standard conformance the error is retained as is now. Since it's a standard violation rather than a GNU extension, I'd prefer if it were enabled only with -std=legacy. Ok with this change. -- Janne Blomqvist
Re: [Patch, Fortran, 4.8/4.9/5 Regression] PR59513 READ or WRITE not allowed after EOF
On 03/22/2015 08:47 AM, Janne Blomqvist wrote: On Sat, Mar 21, 2015 at 12:24 AM, Jerry DeLisle jvdeli...@charter.net wrote: The attached patch allows the attempt to READ or WRITE after an EOF for legacy code. The runtime error is suppressed for -std=legacy and -std=gnu. For standard conformance the error is retained as is now. Since it's a standard violation rather than a GNU extension, I'd prefer if it were enabled only with -std=legacy. Ok with this change. The attached patch adds documentation under 'extensions' in gfortran.texi. Tested with make html. I will commit soon with a ChangeLog entry Regards, Jerry Index: gfortran.texi === --- gfortran.texi (revision 221544) +++ gfortran.texi (working copy) @@ -1404,6 +1404,7 @@ without warning. * OpenMP:: * OpenACC:: * Argument list functions:: +* Read/Write after EOF marker:: @end menu @node Old-style kind specifications @@ -2049,7 +2050,19 @@ For details refer to the g77 manual Also, @code{c_by_val.f} and its partner @code{c_by_val.c} of the GNU Fortran testsuite are worth a look. +@node Read/Write after EOF marker +@subsection Read/Write after EOF marker +@cindex @code{EOF} +@cindex @code{BACKSPACE} +@cindex @code{REWIND} +Some legacy codes rely on allowing @code{READ} or @code{WRITE} after the +EOF file marker in order to find the end of a file. GNU Fortran normally +rejects these codes with a run-time error message and suggests the user +consider @code{BACKSPACE} or @code{REWIND} to properly position +the file before the EOF marker. As an extension, the run-time error may +be disabled using -std=legacy. + @node Extensions not implemented in GNU Fortran @section Extensions not implemented in GNU Fortran @cindex extensions, not implemented
Re: [Patch, Fortran, 4.8/4.9/5 Regression] PR59513 READ or WRITE not allowed after EOF
On 03/22/2015 08:47 AM, Janne Blomqvist wrote: On Sat, Mar 21, 2015 at 12:24 AM, Jerry DeLisle jvdeli...@charter.net wrote: The attached patch allows the attempt to READ or WRITE after an EOF for legacy code. The runtime error is suppressed for -std=legacy and -std=gnu. For standard conformance the error is retained as is now. Since it's a standard violation rather than a GNU extension, I'd prefer if it were enabled only with -std=legacy. Ok with this change. Done. No need for new test case, it is covered by endfile_3.f90 as is. SendingChangeLog Sendingio/transfer.c Transmitting file data .. Committed revision 221572. Thanks and best regards, Jerry
[Patch, Fortran, 4.8/4.9/5 Regression] PR59513 READ or WRITE not allowed after EOF
The attached patch allows the attempt to READ or WRITE after an EOF for legacy code. The runtime error is suppressed for -std=legacy and -std=gnu. For standard conformance the error is retained as is now. Regression tested on x86-64. Test case endfile_3.f90 is updated by the patch. OK for trunk and then 4.9, 4.8? Regards, Jerry 2015-03-20 Jerry DeLisle jvdeli...@gcc.gnu.org PR libgfortran/59513 * io/transfer.c (data_transfer_init): Only error if -std=f95 or higher. Index: libgfortran/io/transfer.c === --- libgfortran/io/transfer.c (revision 221543) +++ libgfortran/io/transfer.c (working copy) @@ -2533,7 +2533,8 @@ data_transfer_init (st_parameter_dt *dtp, int read return; } - if (dtp-u.p.current_unit-endfile == AFTER_ENDFILE) + if (!(compile_options.allow_std GFC_STD_GNU) + dtp-u.p.current_unit-endfile == AFTER_ENDFILE) { generate_error (dtp-common, LIBERROR_OPTION_CONFLICT, Sequential READ or WRITE not allowed after Index: gcc/testsuite/gfortran.dg/endfile_3.f90 === --- gcc/testsuite/gfortran.dg/endfile_3.f90 (revision 221473) +++ gcc/testsuite/gfortran.dg/endfile_3.f90 (working copy) @@ -1,9 +1,10 @@ ! { dg-do run { target fd_truncate } } +! { dg-options -std=f95 } ! pr44477 READ/WRITE not allowed after ENDFILE !--- open(10, form='formatted', action='write', position='rewind', status=scratch) endfile(10) - write(10,'(a)') aa ! { dg-shouldfail Cannot perform ENDFILE } + write(10,'(a)')aa! { dg-shouldfail not allowed after EOF marker } end