From 13926b249f974bcb0428e4379f0338da45bbcd70 Mon Sep 17 00:00:00 2001
From: Jerry DeLisle <jvdelisle@gcc.gnu.org>
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  <jvdelisle@gcc.gnu.org>

	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 37578811fc78..0050bf8cdd1b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2016-10-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+	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  <kargl@gcc.gnu.org>
 
 	PR fortran/71895
diff --git a/gcc/fortran/ioparm.def b/gcc/fortran/ioparm.def
index 17b7ac788188..bd628ce26f59 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 cc355086caea..8494ddc398e8 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 000000000000..41fa0b98f9e9
--- /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 167a0f9714fe..2e3056f21575 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,12 @@
+2016-10-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+	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  <jvdelisle@gcc.gnu.org>
 
 	PR libfortran/78055
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 8b20389d74d1..8c6caefec6eb 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 0879ca7ae8c7..e3f75b67d4e5 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 f787e378b079..712199096ebb 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
-- 
GitLab