re PR fortran/83191 (Writing a namelist with repeated complex numbers)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 3 Dec 2017 16:47:12 +0000 (16:47 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 3 Dec 2017 16:47:12 +0000 (16:47 +0000)
2017-12-03  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
            Dominique d'Humieres  <dominiq@lps.ens.fr>

        PR libgfortran/83191
        * io/transfer.c (list_formatted_read_scalar): Do not set
        namelist_mode bit here. (namelist_read): Likewise.
        (data_transfer_init): Clear the mode bit here.
        (finalize_transfer): Do set the mode bit just before any calls
        to namelist_read or namelist_write. It can now be referred to
        in complex_write.
        ^ io/write.c (write_complex): Suppress the leading blanks when
        namelist_mode bit is not set to 1.

        * gfortran.dg/namelist_95.f90: New test.

Co-Authored-By: Dominique d'Humieres <dominiq@lps.ens.fr>
From-SVN: r255365

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/namelist_95.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/list_read.c
libgfortran/io/transfer.c
libgfortran/io/write.c

index 0a8ed9240ebdccaa4cb57d67de64d4d191fe094c..792d1b91687ce8d6bcfa40a7f4300e2ba4eea62d 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-03  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/831916
+       * gfortran.dg/namelist_95.f90: New test.
+
 2017-12-01  Jan Hubicka  <hubicka@ucw.cz>
 
        PR target/81616
diff --git a/gcc/testsuite/gfortran.dg/namelist_95.f90 b/gcc/testsuite/gfortran.dg/namelist_95.f90
new file mode 100644 (file)
index 0000000..5956648
--- /dev/null
@@ -0,0 +1,23 @@
+! { dg-do run }
+! PR83191 Writing a namelist with repeated complex 
+
+program test
+
+implicit none
+
+integer, parameter :: UNIT = 1
+character(len=8), parameter :: FILE = "namelist"
+
+complex, dimension(3) :: a = (/ (0.0, 0.0), (0.0, 0.0), (3.0, 4.0) /)
+
+namelist /complex_namelist/ a
+
+open(UNIT, file=FILE)
+write(UNIT, nml=complex_namelist)
+close(UNIT)
+
+open(UNIT, file=FILE)
+read(UNIT, nml=complex_namelist)
+close(UNIT, status="delete")
+if (any(a.ne.(/ (0.0, 0.0), (0.0, 0.0), (3.0, 4.0) /))) call abort
+end program test
index 1d4e62434ac5d88535e72f3b7e21b5481bf08285..a43023267eaa813dcaf83f9756b51601a87b471e 100644 (file)
@@ -1,3 +1,16 @@
+2017-12-03  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+           Dominique d'Humieres  <dominiq@lps.ens.fr>
+
+       PR libgfortran/83191
+       * io/transfer.c (list_formatted_read_scalar): Do not set
+       namelist_mode bit here. (namelist_read): Likewise.
+       (data_transfer_init): Clear the mode bit here.
+       (finalize_transfer): Do set the mode bit just before any calls
+       to namelist_read or namelist_write. It can now be referred to
+       in complex_write.
+       ^ io/write.c (write_complex): Suppress the leading blanks when
+       namelist_mode bit is not set to 1.
+
 2017-12-02  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/83225
index 3c03a02cad8da0770aa7279e5d8073cf1aabc44f..379050cecad650f216d9714e9e278bb6a1e91dbe 100644 (file)
@@ -2099,8 +2099,6 @@ list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
   int c, i, m;
   int err = 0;
 
-  dtp->u.p.namelist_mode = 0;
-
   /* Set the next_char and push_char worker functions.  */
   set_workers (dtp);
 
@@ -3546,7 +3544,6 @@ namelist_read (st_parameter_dt *dtp)
      name.  */
   namelist_info *prev_nl = NULL;
 
-  dtp->u.p.namelist_mode = 1;
   dtp->u.p.input_complete = 0;
   dtp->u.p.expanded_read = 0;
 
index 5429a8555416c9016d7ee69e9eb323bf16cf0499..4d7ca7abf7b8ffea576856ab666b38b9749ff1e9 100644 (file)
@@ -2671,7 +2671,7 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
 
   dtp->u.p.ionml = ionml;
   dtp->u.p.mode = read_flag ? READING : WRITING;
-
+  dtp->u.p.namelist_mode = 0;
   dtp->u.p.cc.len = 0;
 
   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
@@ -3890,6 +3890,7 @@ finalize_transfer (st_parameter_dt *dtp)
   if ((dtp->u.p.ionml != NULL)
       && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
     {
+       dtp->u.p.namelist_mode = 1;
        if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
         namelist_read (dtp);
        else
index 582d196c4e30a40771ffc4569d5f1e579735c5ec..926d510f4d7c148504e2661b40699af3242f1247 100644 (file)
@@ -1809,9 +1809,11 @@ write_complex (st_parameter_dt *dtp, const char *source, int kind, size_t size)
                            precision, buf_size, result1, &res_len1);
   get_float_string (dtp, &f, source + size / 2 , kind, 0, buffer,
                            precision, buf_size, result2, &res_len2);
-  lblanks = width - res_len1 - res_len2 - 3;
-
-  write_x (dtp, lblanks, lblanks);
+  if (!dtp->u.p.namelist_mode)
+    {
+      lblanks = width - res_len1 - res_len2 - 3;
+      write_x (dtp, lblanks, lblanks);
+    }
   write_char (dtp, '(');
   write_float_string (dtp, result1, res_len1);
   write_char (dtp, semi_comma);