From 13926b249f974bcb0428e4379f0338da45bbcd70 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Mon, 24 Oct 2016 21:42:29 +0000 Subject: [PATCH] re PR libfortran/77828 (Linking gfortran-7 compiled program with libgfortran of 5.x allowed but crashes when containing write to string) 2016-10-24 Jerry DeLisle PR fortran/77828 * io/io.h (st_parameter_dt): Reorder for readability and sanity. * io/transfer.c (data_transfer_init): Remove TODO and enable the runtime error message, rec= specifier not allowed in STREAM access. * libtool-version: Bump major version of libgfortran to 4. * ioparm.def: Reorder dt parameters to match libgfortran. * libgfortran.h: Swap definitions of GFC_INTERNAL_UNIT and GFC_INTERNAL_UNIT4. From-SVN: r241497 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/ioparm.def | 6 ++---- gcc/fortran/libgfortran.h | 4 ++-- gcc/testsuite/gfortran.dg/streamio_17.f90 | 12 ++++++++++++ libgfortran/ChangeLog | 9 +++++++++ libgfortran/io/io.h | 24 +++++++++++------------ libgfortran/io/transfer.c | 9 +-------- libgfortran/libtool-version | 2 +- 8 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/streamio_17.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 37578811fc7..0050bf8cdd1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-10-24 Jerry DeLisle + + PR fortran/77828 + * ioparm.def: Reorder dt parameters to match libgfortran. + * libgfortran.h: Swap definitions of GFC_INTERNAL_UNIT and + GFC_INTERNAL_UNIT4. + 2016-10-24 Steven G. Kargl PR fortran/71895 diff --git a/gcc/fortran/ioparm.def b/gcc/fortran/ioparm.def index 17b7ac78818..bd628ce26f5 100644 --- a/gcc/fortran/ioparm.def +++ b/gcc/fortran/ioparm.def @@ -90,11 +90,9 @@ IOPARM (inquire, id, 1 << 7, pint4) IOPARM (inquire, iqstream, 1 << 8, char1) IOPARM (wait, common, 0, common) IOPARM (wait, id, 1 << 7, pint4) -#ifndef IOPARM_dt_list_format +IOPARM (dt, common, 0, common) #define IOPARM_dt_list_format (1 << 7) #define IOPARM_dt_namelist_read_mode (1 << 8) -#endif -IOPARM (dt, common, 0, common) IOPARM (dt, rec, 1 << 9, intio) IOPARM (dt, size, 1 << 10, pintio) IOPARM (dt, iolength, 1 << 11, pintio) @@ -103,7 +101,6 @@ IOPARM (dt, format, 1 << 12, char1) IOPARM (dt, advance, 1 << 13, char2) IOPARM (dt, internal_unit, 1 << 14, char1) IOPARM (dt, namelist_name, 1 << 15, char2) -IOPARM (dt, u, 0, pad) IOPARM (dt, id, 1 << 16, pint4) IOPARM (dt, pos, 1 << 17, intio) IOPARM (dt, asynchronous, 1 << 18, char1) @@ -115,3 +112,4 @@ IOPARM (dt, round, 1 << 23, char2) IOPARM (dt, sign, 1 << 24, char1) #define IOPARM_dt_f2003 (1 << 25) #define IOPARM_dt_dtio (1 << 26) +IOPARM (dt, u, 0, pad) diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h index cc355086cae..8494ddc398e 100644 --- a/gcc/fortran/libgfortran.h +++ b/gcc/fortran/libgfortran.h @@ -70,8 +70,8 @@ along with GCC; see the file COPYING3. If not see /* Special unit numbers used to convey certain conditions. Numbers -4 thru -9 available. NEWUNIT values start at -10. */ -#define GFC_INTERNAL_UNIT4 -1 /* KIND=4 Internal Unit. */ -#define GFC_INTERNAL_UNIT -2 /* KIND=1 Internal Unit. */ +#define GFC_INTERNAL_UNIT -1 /* KIND=1 Internal Unit. */ +#define GFC_INTERNAL_UNIT4 -2 /* KIND=4 Internal Unit. */ #define GFC_INVALID_UNIT -3 /* Possible values for the CONVERT I/O specifier. */ diff --git a/gcc/testsuite/gfortran.dg/streamio_17.f90 b/gcc/testsuite/gfortran.dg/streamio_17.f90 new file mode 100644 index 00000000000..41fa0b98f9e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/streamio_17.f90 @@ -0,0 +1,12 @@ +! { dg-do run } +program stream_test +implicit none +integer :: ios +character(128) :: message +open(10, status='scratch', access='stream') +write (10, rec=1, iostat=ios, iomsg=message) "This is a test" ! +if (ios.ne.5001) call abort +if (message.ne. & + &"Record number not allowed for stream access data transfer") & + call abort +end program diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 167a0f9714f..2e3056f2157 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,12 @@ +2016-10-24 Jerry DeLisle + + PR fortran/77828 + * io/io.h (st_parameter_dt): Reorder for readability and sanity. + * io/transfer.c (data_transfer_init): Remove TODO and enable the + runtime error message, rec= specifier not allowed in STREAM + access. + * libtool-version: Bump major version of libgfortran to 4. + 2016-10-21 Jerry DeLisle PR libfortran/78055 diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 8b20389d74d..8c6caefec6e 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -424,6 +424,15 @@ typedef struct st_parameter_dt CHARACTER2 (advance); CHARACTER1 (internal_unit); CHARACTER2 (namelist_name); + GFC_INTEGER_4 *id; + GFC_IO_INT pos; + CHARACTER1 (asynchronous); + CHARACTER2 (blank); + CHARACTER1 (decimal); + CHARACTER2 (delim); + CHARACTER1 (pad); + CHARACTER2 (round); + CHARACTER1 (sign); /* Private part of the structure. The compiler just needs to reserve enough space. */ union @@ -440,7 +449,8 @@ typedef struct st_parameter_dt unit_blank blank_status; unit_sign sign_status; int scale_factor; - int max_pos; /* Maximum righthand column written to. */ + /* Maximum righthand column written to. */ + int max_pos; /* Number of skips + spaces to be done for T and X-editing. */ int skips; /* Number of spaces to be done for T and X-editing. */ @@ -494,8 +504,7 @@ typedef struct st_parameter_dt are an unsigned char, EOF, or EOF - 1 used to mark the field as not valid. */ int last_char; /* No longer used, moved to gfc_unit. */ - char nml_delim; - + int nml_delim; int repeat_count; int saved_length; int saved_used; @@ -523,15 +532,6 @@ typedef struct st_parameter_dt must be smaller or equal to this array. */ char pad[16 * sizeof (char *) + 32 * sizeof (int)]; } u; - GFC_INTEGER_4 *id; - GFC_IO_INT pos; - CHARACTER1 (asynchronous); - CHARACTER2 (blank); - CHARACTER1 (decimal); - CHARACTER2 (delim); - CHARACTER1 (pad); - CHARACTER2 (round); - CHARACTER1 (sign); } st_parameter_dt; diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 0879ca7ae8c..e3f75b67d4e 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -3026,20 +3026,13 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag) return; } - /* TODO: This is required to maintain compatibility between - 4.3 and 4.4 runtime. Remove when ABI changes from 4.3 */ - - if (is_stream_io (dtp)) - dtp->u.p.current_unit->strm_pos = dtp->rec; - - /* TODO: Un-comment this code when ABI changes from 4.3. if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM) { generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT, "Record number not allowed for stream access " "data transfer"); return; - } */ + } } /* Bugware for badly written mixed C-Fortran I/O. */ diff --git a/libgfortran/libtool-version b/libgfortran/libtool-version index f787e378b07..712199096eb 100644 --- a/libgfortran/libtool-version +++ b/libgfortran/libtool-version @@ -3,4 +3,4 @@ # This is a separate file so that version updates don't involve re-running # automake. # CURRENT:REVISION:AGE -3:0:0 +4:0:0 -- 2.30.2