From 5068c62534ea09fb508d49be3e596a637eee54d0 Mon Sep 17 00:00:00 2001 From: Thomas Koenig <Thomas.Koenig@online.de> Date: Sat, 25 Mar 2006 21:31:48 +0000 Subject: [PATCH] re PR libfortran/26735 ([4.1 only] -fconvert=swap and implied open) 2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/26735 * io/transfer.c (data_transfer_init): Set u_flags.convert on an unopened unit if specified by environment variable (via get_unformatted_convert) or by compile-time option. 2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/26735 * gfortran.dg/convert_implied_open.f90: New test case. From-SVN: r112382 --- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/convert_implied_open.f90 | 15 +++++++++ libgfortran/ChangeLog | 7 +++++ libgfortran/io/transfer.c | 31 +++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/convert_implied_open.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc7b98db9072..7bd5d1f69218 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> + + PR libfortran/26735 + * gfortran.dg/convert_implied_open.f90: New test case. + 2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> PR fortran/26769 diff --git a/gcc/testsuite/gfortran.dg/convert_implied_open.f90 b/gcc/testsuite/gfortran.dg/convert_implied_open.f90 new file mode 100644 index 000000000000..4066f618cc22 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/convert_implied_open.f90 @@ -0,0 +1,15 @@ +! { dg-do run } +! { dg-options "-fconvert=swap" } +! PR 26735 - implied open didn't use to honor -fconvert +program main + implicit none + integer (kind=8) :: i1, i2, i3 + write (10) 1_8 + close (10) + open (10, form="unformatted", access="direct", recl=8) + read (10,rec=1) i1 + read (10,rec=2) i2 + read (10,rec=3) i3 + if (i1 /= 8 .or. i2 /= 1 .or. i3 /= 8) call abort + close (10,status="delete") +end program main diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 99daa8de3e23..136556af07e1 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> + + PR libfortran/26735 + * io/transfer.c (data_transfer_init): Set u_flags.convert + on an unopened unit if specified by environment variable + (via get_unformatted_convert) or by compile-time option. + 2006-03-25 Thomas Koenig <Thomas.Koenig@online.de> PR fortran/26769 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 32e3881c27f7..5f5f32303c9e 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1390,6 +1390,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag) if (dtp->u.p.current_unit->s == NULL) { /* Open the unit with some default flags. */ st_parameter_open opp; + unit_convert conv; + if (dtp->common.unit < 0) { close_unit (dtp->u.p.current_unit); @@ -1413,6 +1415,35 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag) u_flags.blank = BLANK_UNSPECIFIED; u_flags.pad = PAD_UNSPECIFIED; u_flags.status = STATUS_UNKNOWN; + + conv = get_unformatted_convert (dtp->common.unit); + + if (conv == CONVERT_NONE) + conv = compile_options.convert; + + /* We use l8_to_l4_offset, which is 0 on little-endian machines + and 1 on big-endian machines. */ + switch (conv) + { + case CONVERT_NATIVE: + case CONVERT_SWAP: + break; + + case CONVERT_BIG: + conv = l8_to_l4_offset ? CONVERT_NATIVE : CONVERT_SWAP; + break; + + case CONVERT_LITTLE: + conv = l8_to_l4_offset ? CONVERT_SWAP : CONVERT_NATIVE; + break; + + default: + internal_error (&opp.common, "Illegal value for CONVERT"); + break; + } + + u_flags.convert = conv; + opp.common = dtp->common; opp.common.flags &= IOPARM_COMMON_MASK; dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags); -- GitLab