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