https://gcc.gnu.org/g:ca2681d45a45077010bcc5a4547450044bdd6d78

commit r15-7009-gca2681d45a45077010bcc5a4547450044bdd6d78
Author: Harald Anlauf <anl...@gmx.de>
Date:   Fri Jan 17 21:20:31 2025 +0100

    libfortran: G formatting for UNSIGNED [PR118536]
    
            PR libfortran/118536
    
    libgfortran/ChangeLog:
    
            * io/transfer.c (formatted_transfer_scalar_write): Handle UNSIGNED
            in G formatting.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/unsigned_write_2.f90: New test.

Diff:
---
 gcc/testsuite/gfortran.dg/unsigned_write_2.f90 | 30 ++++++++++++++++++++++++++
 libgfortran/io/transfer.c                      |  3 +++
 2 files changed, 33 insertions(+)

diff --git a/gcc/testsuite/gfortran.dg/unsigned_write_2.f90 
b/gcc/testsuite/gfortran.dg/unsigned_write_2.f90
new file mode 100644
index 000000000000..091e9b99f107
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unsigned_write_2.f90
@@ -0,0 +1,30 @@
+! { dg-do  run }
+! This is a libgfortran (runtime library) test, need to run only once!
+!
+! { dg-additional-options "-funsigned" }
+!
+! PR libfortran/118536 - G formatting for UNSIGNED
+
+program print_unsigned_g_formatted
+  character(21) :: s1, s2
+  unsigned(1)  :: u1 = huge(0U_1)
+  unsigned(2)  :: u2 = huge(0U_2)
+  unsigned(4)  :: u4 = huge(0U_4)
+  unsigned(8)  :: u8 = huge(0U_8)
+
+  write(s1,'(i0)') u1
+  write(s2,'(g0)') u1
+  if (s1 /= s2) stop 1
+
+  write(s1,'(i0)') u2
+  write(s2,'(g0)') u2
+  if (s1 /= s2) stop 2
+
+  write(s1,'(i0)') u4
+  write(s2,'(g0)') u4
+  if (s1 /= s2) stop 3
+
+  write(s1,'(i0)') u8
+  write(s2,'(g0)') u8
+  if (s1 /= s2) stop 4
+end
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 0177e0520628..b3b72f39c5b1 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -2365,6 +2365,9 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt 
type, void *p, int kin
              case BT_INTEGER:
                write_i (dtp, f, p, kind);
                break;
+             case BT_UNSIGNED:
+               write_iu (dtp, f, p, kind);
+               break;
              case BT_LOGICAL:
                write_l (dtp, f, p, kind);
                break;

Reply via email to