From c4508d0ad7fb8fe23517a6b5e874c4573fdec8a0 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Sun, 3 Dec 2017 16:47:12 +0000 Subject: [PATCH] re PR fortran/83191 (Writing a namelist with repeated complex numbers) 2017-12-03 Jerry DeLisle Dominique d'Humieres 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 From-SVN: r255365 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/namelist_95.f90 | 23 +++++++++++++++++++++++ libgfortran/ChangeLog | 13 +++++++++++++ libgfortran/io/list_read.c | 3 --- libgfortran/io/transfer.c | 3 ++- libgfortran/io/write.c | 8 +++++--- 6 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/namelist_95.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0a8ed9240eb..792d1b91687 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-12-03 Jerry DeLisle + + PR fortran/831916 + * gfortran.dg/namelist_95.f90: New test. + 2017-12-01 Jan Hubicka 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 index 00000000000..59566480865 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/namelist_95.f90 @@ -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 diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 1d4e62434ac..a43023267ea 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,16 @@ +2017-12-03 Jerry DeLisle + Dominique d'Humieres + + 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 PR libgfortran/83225 diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 3c03a02cad8..379050cecad 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -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; diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 5429a855541..4d7ca7abf7b 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -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 diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 582d196c4e3..926d510f4d7 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -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);