This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
patch libfortran/37753
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: fortran at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 08 Oct 2008 22:12:54 +0200
- Subject: 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