https://gcc.gnu.org/g:471c3c3da9c55fd99f813d16ffa9bde499539333

commit r17-1733-g471c3c3da9c55fd99f813d16ffa9bde499539333
Author: Jerry DeLisle <[email protected]>
Date:   Sun Jun 21 21:20:41 2026 -0700

    fortran: Fix FMT_X and adjust the test case.
    
            PR libfortran/118774
    
    libgfortran/ChangeLog:
    
            * io/transfer.c (formatted_transfer_scalar_write): Set nspaces
            to number of skips for FMT_X.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/fmt_t_10.f90: Adjust the test case results
            check.

Diff:
---
 gcc/testsuite/gfortran.dg/fmt_t_10.f90 | 2 +-
 libgfortran/io/transfer.c              | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/fmt_t_10.f90 
b/gcc/testsuite/gfortran.dg/fmt_t_10.f90
index 1f714d24d4e8..628363dab4f8 100644
--- a/gcc/testsuite/gfortran.dg/fmt_t_10.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_t_10.f90
@@ -10,6 +10,6 @@ program fmt_t_10
    character(21) :: output1, output2
    write (output1, fmt1) 'RADIX', radix(pi)
    write (output2, fmt2) 'RADIX', radix(pi)
-   if (output1 /= 'RADIX.............. 2') stop 1
+   if (output1 /= 'RADIX ............. 2') stop 1
    if (output2 /= 'RADIX ............. 2') stop 2
 end program fmt_t_10
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index de7b6d7df35c..95ead6936f20 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -2423,10 +2423,11 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, 
bt type, void *p, int kin
          if (dtp->u.p.pending_spaces < 0 && dtp->u.p.skips > 0)
            {
              /* The advance falls within already-written content (e.g. after
-                a backward tab).  Advance the position without overwriting
-                the existing characters.  */
+                a backward tab).  FMT_X sets positions to blank per the
+                standard; FMT_TR skips without overwriting existing 
characters.  */
              gfc_offset new_max;
-             write_x (dtp, dtp->u.p.skips, 0);
+             int nspaces = f->format == FMT_X ? dtp->u.p.skips : 0;
+             write_x (dtp, dtp->u.p.skips, nspaces);
 
              /* Adjust the max position depending on the type of write.  */
              if (is_stream_io (dtp))

Reply via email to