This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch libfortran/37753


Hello world,

this fixes PR 37753, a 4.4 regression where we erroneously would write
out strings in reverse when specifying CONVERT="SWAP" (or equivalent).

Regression-tested on x86_64-pc-linux-gnu.  OK?

	Thomas

2008-10-08  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/37753
	* io/transfer.c (unformatted_read):  CONVERT_NATIVE
	is the usual case.  Check for kind==1 for non-byte-reversing
	operation.
	(unformatted_write):  Likewise.

2008-10-08  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/37753
	* gfortran.dg/convert_2.f90:  New test case.

Index: io/transfer.c
===================================================================
--- io/transfer.c	(revision 140951)
+++ io/transfer.c	(working copy)
@@ -738,8 +738,8 @@ unformatted_read (st_parameter_dt *dtp, 
 {
   size_t i, sz;
 
-  if (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE
-      || size == 1)
+  if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE)
+      || kind == 1)
     {
       sz = size * nelems;
       if (type == BT_CHARACTER)
@@ -789,8 +789,8 @@ static void
 unformatted_write (st_parameter_dt *dtp, bt type,
 		   void *source, int kind, size_t size, size_t nelems)
 {
-  if (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE ||
-      size == 1)
+  if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE) 
+      || kind == 1)
     {
       size_t stride = type == BT_CHARACTER ?
 		  size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
! { dg-do run }
! Check for correct ordering of character variables with CONVERT

program main
  implicit none
  integer, parameter :: two_swap = 2**25
  integer(kind=4) i,j
  character(len=2) :: c,d
  open(20,file="convert.dat",form="unformatted",convert="swap") ! { dg-warning "CONVERT" }
  write (20) "ab"
  close (20)
  open(20,file="convert.dat",form="unformatted",access="stream")
  read(20) i,c,j
  if (i .ne. two_swap .or. j .ne. two_swap .or. c .ne. "ab") call abort
  close (20)
  open(20,file="convert.dat",form="unformatted",convert="swap") ! { dg-warning "CONVERT" }
  read (20) d
  close (20,status="delete")
  if (d .ne. "ab") call abort
end program main

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]