diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc7b98db907275ebe626a4528d00ba07334c9492..7bd5d1f69218bc0cefd2d92608e1107d340a86b5 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 0000000000000000000000000000000000000000..4066f618cc223f50bd0312ad6a3c781c1caf0d54 --- /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 99daa8de3e23db0331ff123845fa643f83b07761..136556af07e16bfe05b1ba7f70ee91bb75b426d0 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 32e3881c27f790acc2a2e472ee90dc665b37a213..5f5f32303c9e3f31e6016c469e1adb7e870784ba 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);