re PR fortran/83225 (runtime error in transfer.c)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 3 Dec 2017 03:26:09 +0000 (03:26 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 3 Dec 2017 03:26:09 +0000 (03:26 +0000)
2017-12-02  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/83225
* io/io.h (is_internal_unit): Use the unit_is_internal bit.
* io/transfer.c (data_transfer_init): Set the bit to true for
internal umits. Use that bit for checks for internal unit
initializations.
* io/unit.c (insert_unit): As a precaution, set the
internal_unit_kind to zero when a unit structure is first created.

From-SVN: r255362

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/transfer.c
libgfortran/io/unit.c

index a1cf6b891ce45d36f6f55e17fa2a14832e14ccbf..37b5281bde6e5890e8b1d9a1c7f720965c968762 100644 (file)
@@ -1,3 +1,13 @@
+2017-12-02  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/83225
+       * io/io.h (is_internal_unit): Use the unit_is_internal bit.
+       * io/transfer.c (data_transfer_init): Set the bit to true for
+       internal umits. Use that bit for checks for internal unit
+       initializations.
+       * io/unit.c (insert_unit): As a precaution, set the
+       internal_unit_kind to zero when a unit structure is first created.
+
 2017-11-28  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR fortran/53796
index fd48bf19e9bf33abcc48a73f432ffee02ecc7980..c5e73d80eadb7b487ce5d953e63e9195666ba3ac 100644 (file)
@@ -69,7 +69,7 @@ internal_proto(old_locale_lock);
 
 #define is_array_io(dtp) ((dtp)->internal_unit_desc)
 
-#define is_internal_unit(dtp) ((dtp)->u.p.current_unit->internal_unit_kind)
+#define is_internal_unit(dtp) ((dtp)->u.p.unit_is_internal)
 
 #define is_stream_io(dtp) ((dtp)->u.p.current_unit->flags.access == ACCESS_STREAM)
 
index 1ac4c5164e9eda8c0ac7aebdc7169830cd54af97..5429a8555416c9016d7ee69e9eb323bf16cf0499 100644 (file)
@@ -2764,6 +2764,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
       else
        dtp->u.p.current_unit->has_size = false;
     }
+  else if (dtp->u.p.current_unit->internal_unit_kind > 0)
+    dtp->u.p.unit_is_internal = 1;
 
   /* Check the action.  */
 
@@ -4085,7 +4087,7 @@ st_read_done (st_parameter_dt *dtp)
   if (dtp->u.p.current_unit != NULL
       && dtp->u.p.current_unit->child_dtio == 0)
     {
-      if (is_internal_unit (dtp))
+      if (dtp->u.p.unit_is_internal)
        {
          if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
            {
@@ -4099,7 +4101,7 @@ st_read_done (st_parameter_dt *dtp)
            }
          newunit_free (dtp->common.unit);
        }
-      if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
+      if (dtp->u.p.unit_is_internal || dtp->u.p.format_not_saved)
        {
          free_format_data (dtp->u.p.fmt);
          free_format (dtp);
@@ -4156,7 +4158,7 @@ st_write_done (st_parameter_dt *dtp)
 
       /* If this is a parent WRITE statement we do not need to retain the
         internal unit structure for child use.  */
-      if (is_internal_unit (dtp))
+      if (dtp->u.p.unit_is_internal)
        {
          if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
            {
@@ -4170,7 +4172,7 @@ st_write_done (st_parameter_dt *dtp)
            }
          newunit_free (dtp->common.unit);
        }
-      if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
+      if (dtp->u.p.unit_is_internal || dtp->u.p.format_not_saved)
        {
          free_format_data (dtp->u.p.fmt);
          free_format (dtp);
index fbb33046dee8bfa50245e5acb62e4d972e5930e9..66cd12dcdcd9f2c0310b2173f5ce9fd2fc950965 100644 (file)
@@ -231,6 +231,7 @@ insert_unit (int n)
 {
   gfc_unit *u = xcalloc (1, sizeof (gfc_unit));
   u->unit_number = n;
+  u->internal_unit_kind = 0;
 #ifdef __GTHREAD_MUTEX_INIT
   {
     __gthread_mutex_t tmp = __GTHREAD_MUTEX_INIT;