Hi Folks,

The attached patch does some minor cleanup and bumps the libgfortran version number. I have wanted to reorder the dtp structure for many years now. Not strictly needed but it has bugged me forever.


The bump is needed because of the significant changes from implementation of 
DTIO.

I also took care of the stream I/O TODO and added a new test case for the error message.

On my system, I have LD_LIBRARY_PATH set to point to the new library version first and then the version 3 are found elsewhere. With the patch we now see the following behavior. (Test case in the PR)

Compile with version 6. Finds libgfortran3 on execution:
$gfc6 pr77828.f90
$ ./a.out
 Greetings from i 42 of 43

 Greetings from i 42 of 43

Compile with version 7. Finds libgfortran4 on execution:
$ gfc pr77828.f90
[jerry@amda8 pr77828]$ ./a.out
 Greetings from i 42 of 43

 Greetings from i 42 of 43

Change LD_LIBRARY_PATH to not find libgfortran4:
$ export LD_LIBRARY_PATH=/home/jerry/dev/usr6/lib64
$ gfc pr77828.f90
$ ./a.out
./a.out: error while loading shared libraries: libgfortran.so.4: cannot open shared object file: No such file or directory

Word of caution. When this patch is applied rebuild from a clean/empty build directory. You must delete any libgfortran3 remnants that may have been built and installed previously with gcc version 7 trunk, Otherwise the linker/loader may find those rather than a libgfortran3 built for gcc 6 or previous. (When compiling with a previous version of gcc)

New test case provided for the streamio error check.

Regression tested on x86-64-linux.

OK for trunk?

Regards,

Jerry

2016-10-18  Jerry DeLisle  <jvdeli...@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-18  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR fortran/77828
        * ioparm.def: Reorder dt parameters to match libgfortran.



diff --git a/gcc/fortran/ioparm.def b/gcc/fortran/ioparm.def
index 17b7ac78..bd628ce2 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/testsuite/gfortran.dg/streamio_17.f90 b/gcc/testsuite/gfortran.dg/streamio_17.f90
new file mode 100644
index 00000000..41fa0b98
--- /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/io/io.h b/libgfortran/io/io.h
index edc520a9..cae2193b 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.  */
@@ -522,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 1f46ca64..fa2ec7b3 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 f787e378..71219909 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
! { 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

Reply via email to