re PR fortran/82511 (ICE Bad IO basetype (12) on attempted read or write of entire...
authorFritz Reese <fritzoreese@gmail.com>
Mon, 16 Oct 2017 17:40:53 +0000 (17:40 +0000)
committerFritz Reese <foreese@gcc.gnu.org>
Mon, 16 Oct 2017 17:40:53 +0000 (17:40 +0000)
2017-10-16  Fritz Reese <fritzoreese@gmail.com>

    PR fortran/82511
    Treat UNION components as DT comp. in I/O lists.

    gcc/fortran/ChangeLog:

PR fortran/82511
* trans-io.c (transfer_expr): Treat BT_UNION as BT_DERIVED.

    gcc/testsuite/ChangeLog:

PR fortran/82511
* gfortran.dg/dec_structure_22.f90: New testcase.

From-SVN: r253791

gcc/fortran/ChangeLog
gcc/fortran/trans-io.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dec_structure_22.f90 [new file with mode: 0644]

index 5b003d8..02763fe 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-16  Fritz Reese <fritzoreese@gmail.com>
+
+       PR fortran/82511
+       * trans-io.c (transfer_expr): Treat BT_UNION as BT_DERIVED.
+
 2017-10-15  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/82372
index 026f9a9..f3e1f3e 100644 (file)
@@ -2404,7 +2404,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
     case BT_CLASS:
       if (ts->u.derived->components == NULL)
        return;
-      if (ts->type == BT_DERIVED || ts->type == BT_CLASS)
+      if (gfc_bt_struct (ts->type) || ts->type == BT_CLASS)
        {
          gfc_symbol *derived;
          gfc_symbol *dtio_sub = NULL;
@@ -2438,7 +2438,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
              function = iocall[IOCALL_X_DERIVED];
              break;
            }
-         else if (ts->type == BT_DERIVED)
+         else if (gfc_bt_struct (ts->type))
            {
              /* Recurse into the elements of the derived type.  */
              expr = gfc_evaluate_now (addr_expr, &se->pre);
index c47464e..fb2021a 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-16  Fritz Reese <fritzoreese@gmail.com>
+
+       PR fortran/82511
+       * gfortran.dg/dec_structure_22.f90: New testcase.
+
 2017-10-16  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/64931
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_22.f90 b/gcc/testsuite/gfortran.dg/dec_structure_22.f90
new file mode 100644 (file)
index 0000000..ddbee02
--- /dev/null
@@ -0,0 +1,38 @@
+      ! { dg-do run }
+      ! { dg-options "-fdec-structure" }
+      !
+      ! PR fortran/82511
+      !
+      ! Verify that structure variables with UNION components
+      ! are accepted in an I/O-list READ.
+      !
+      implicit none
+
+      structure /s/
+        union
+          map
+            character(16) :: c16_1
+          end map
+          map
+            character(16) :: c16_2
+          end map
+        end union
+      end structure
+
+      record /s/ r
+      character(32) :: instr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^"
+
+      r.c16_1 = '                '
+      r.c16_2 = '                '
+      ! The record r shall be treated as if its components are listed:
+      ! read(...) r.c16_1, r.c16_2
+      ! This shall correspond to the formatted read of A16,A16
+      read(instr, '(A16,A16)') r
+
+      ! r.c16_1 and r.c16_2 are in a union, thus share the same memory
+      ! and the first 16 bytes of instr are overwritten
+      if ( r.c16_1 .ne. instr(17:32) .or. r.c16_2 .ne. instr(17:32) ) then
+        call abort()
+      endif
+
+      end