https://gcc.gnu.org/g:794c029d592b0e47e5698da855c995dad4bbb586

commit r16-9835-g794c029d592b0e47e5698da855c995dad4bbb586
Author: Thomas Koenig <[email protected]>
Date:   Sat Oct 24 17:24:42 2026 +0200

    LEADZ, POPCNT, POPPAR and TRAILZ for unsigned numbers.
    
    Playing around with UNSIGNED, I noted that LEADZ and TRAILZ were rejected
    for UNSIGNED, which makes no sense.  POPCNT and POPPAR worked, but this
    was not documented.  All that was needed for the LEADZ and TRAILZ to work
    was to adjust the check routine.
    
    gcc/fortran/ChangeLog:
    
            PR fortran/128124
            * gfortran.texi: Note that LEADZ, POPCNT, POPPAR and TRAILZ take
            unsigned arguments.
            * intrinsic.cc (add_functions): LEADZ and TRAILZ also take unsigned
            arguments.
            * intrinsic.texi: Document unsigned arguments for LEADZ, POPCNT, 
POPPAR
            and TRAILZ.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/128124
            * gfortran.dg/unsigned_45.f90: New test.
    
    (cherry picked from commit bd6079f1a465fad5c9916bcad71c583a69fbd281)

Diff:
---
 gcc/fortran/gfortran.texi                 |  4 ++
 gcc/fortran/intrinsic.cc                  |  4 +-
 gcc/fortran/intrinsic.texi                |  8 ++--
 gcc/testsuite/gfortran.dg/unsigned_45.f90 | 67 +++++++++++++++++++++++++++++++
 4 files changed, 77 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 16553508a58b..f480ea2078fa 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -2622,6 +2622,7 @@ The following intrinsics take unsigned arguments:
 @item @code{IPARITY}, @pxref{IPARITY}
 @item @code{ISHFT}, @pxref{ISHFT}
 @item @code{ISHFTC}, @pxref{ISHFTC}
+@item @code{LEADZ}, @pxref{LEADZ}
 @item @code{MATMUL}, @pxref{MATMUL}
 @item @code{MAX}, @pxref{MAX}
 @item @code{MAXLOC}, @pxref{MAXLOC}
@@ -2636,6 +2637,8 @@ The following intrinsics take unsigned arguments:
 @item @code{MVBITS}, @pxref{MVBITS}
 @item @code{NOT}, @pxref{NOT}
 @item @code{OUT_OF_RANGE}, @pxref{OUT_OF_RANGE}
+@item @code{POPCNT}, @pxref{POPCNT}
+@item @code{POPPAR}, @pxref{POPPAR}
 @item @code{PRODUCT}, @pxref{PRODUCT}
 @item @code{RANDOM_NUMBER}, @pxref{RANDOM_NUMBER}
 @item @code{RANGE}, @pxref{RANGE}
@@ -2644,6 +2647,7 @@ The following intrinsics take unsigned arguments:
 @item @code{SHIFTL}, @pxref{SHIFTL}
 @item @code{SHIFTR}, @pxref{SHIFTR}
 @item @code{SUM}, @pxref{SUM}
+@item @code{TRAILZ}, @pxref{TRAILZ}
 @item @code{TRANSPOSE}, @pxref{TRANSPOSE}
 @item @code{TRANSFER}, @pxref{TRANSFER}
 @end itemize
diff --git a/gcc/fortran/intrinsic.cc b/gcc/fortran/intrinsic.cc
index 6ffd7237468e..6945cdeca728 100644
--- a/gcc/fortran/intrinsic.cc
+++ b/gcc/fortran/intrinsic.cc
@@ -2476,7 +2476,7 @@ add_functions (void)
 
   add_sym_1 ("leadz", GFC_ISYM_LEADZ, CLASS_ELEMENTAL, ACTUAL_NO,
             BT_INTEGER, di, GFC_STD_F2008,
-            gfc_check_i, gfc_simplify_leadz, NULL,
+            gfc_check_iu, gfc_simplify_leadz, NULL,
             i, BT_INTEGER, di, REQUIRED);
 
   make_generic ("leadz", GFC_ISYM_LEADZ, GFC_STD_F2008);
@@ -3368,7 +3368,7 @@ add_functions (void)
 
   add_sym_1 ("trailz", GFC_ISYM_TRAILZ, CLASS_ELEMENTAL, ACTUAL_NO,
             BT_INTEGER, di, GFC_STD_F2008,
-            gfc_check_i, gfc_simplify_trailz, NULL,
+            gfc_check_iu, gfc_simplify_trailz, NULL,
             i, BT_INTEGER, di, REQUIRED);
 
   make_generic ("trailz", GFC_ISYM_TRAILZ, GFC_STD_F2008);
diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi
index e3910f122b9a..e275eadadd49 100644
--- a/gcc/fortran/intrinsic.texi
+++ b/gcc/fortran/intrinsic.texi
@@ -9629,7 +9629,7 @@ Elemental function
 
 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
-@item @var{I} @tab Shall be of type @code{INTEGER}.
+@item @var{I} @tab Shall be of type @code{INTEGER} or @code{UNSIGNED}.
 @end multitable
 
 @item @emph{Return value}:
@@ -12120,7 +12120,7 @@ Elemental function
 
 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
-@item @var{I} @tab Shall be of type @code{INTEGER}.
+@item @var{I} @tab Shall be of type @code{INTEGER} or @code{UNSIGNED}.
 @end multitable
 
 @item @emph{Return value}:
@@ -12168,7 +12168,7 @@ Elemental function
 
 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
-@item @var{I} @tab Shall be of type @code{INTEGER}.
+@item @var{I} @tab Shall be of type @code{INTEGER} or @code{UNSIGNED}.
 @end multitable
 
 @item @emph{Return value}:
@@ -15292,7 +15292,7 @@ Elemental function
 
 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
-@item @var{I} @tab Shall be of type @code{INTEGER}.
+@item @var{I} @tab Shall be of type @code{INTEGER} or @code{UNSIGNED}.
 @end multitable
 
 @item @emph{Return value}:
diff --git a/gcc/testsuite/gfortran.dg/unsigned_45.f90 
b/gcc/testsuite/gfortran.dg/unsigned_45.f90
new file mode 100644
index 000000000000..076e0376b00e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unsigned_45.f90
@@ -0,0 +1,67 @@
+! { dg-do run }
+! { dg-additional-options "-funsigned" }
+! Check for implementation of leadz and trailz for unsigned types.
+program memain
+  integer(kind=1) :: i1
+  integer(kind=2) :: i2
+  integer(kind=4) :: i4
+  integer(kind=8) :: i8
+  integer(kind=16) :: i16
+  unsigned(kind=1) :: u1
+  unsigned(kind=2) :: u2
+  unsigned(kind=4) :: u4
+  unsigned(kind=8) :: u8
+  unsigned(kind=16) :: u16
+
+  i1 = 12_1
+  u1 = 12u_1
+  if (leadz(i1) /= leadz(u1)) stop 1
+  if (leadz(u1) /= leadz(12u_1)) stop 1
+  if (trailz(i1) /= trailz(u1)) stop 3
+  if (trailz(u1) /= trailz(12u_1)) stop 3
+  if (popcnt(i1) /= popcnt(u1)) stop 5
+  if (popcnt(u1) /= popcnt(12u_1)) stop 5
+  if (poppar(i1) /= poppar(u1)) stop 7
+  if (poppar(u1) /= poppar(12u_1)) stop 7
+  i2 = 1348_2
+  u2 = 1348u_2
+  if (leadz(i2) /= leadz(u2)) stop 9
+  if (leadz(u2) /= leadz(1348u_2)) stop 9
+  if (trailz(i2) /= trailz(u2)) stop 11
+  if (trailz(u2) /= trailz(1348u_2)) stop 11
+  if (popcnt(i2) /= popcnt(u2)) stop 13
+  if (popcnt(u2) /= popcnt(1348u_2)) stop 13
+  if (poppar(i2) /= poppar(u2)) stop 15
+  if (poppar(u2) /= poppar(1348u_2)) stop 15
+  i4 = 172472_4
+  u4 = 172472u_4
+  if (leadz(i4) /= leadz(u4)) stop 17
+  if (leadz(u4) /= leadz(172472u_4)) stop 17
+  if (trailz(i4) /= trailz(u4)) stop 19
+  if (trailz(u4) /= trailz(172472u_4)) stop 19
+  if (popcnt(i4) /= popcnt(u4)) stop 21
+  if (popcnt(u4) /= popcnt(172472u_4)) stop 21
+  if (poppar(i4) /= poppar(u4)) stop 23
+  if (poppar(u4) /= poppar(172472u_4)) stop 23
+  i8 = 18744625769701376_8
+  u8 = 18744625769701376u_8
+  if (leadz(i8) /= leadz(u8)) stop 25
+  if (leadz(u8) /= leadz(18744625769701376u_8)) stop 25
+  if (trailz(i8) /= trailz(u8)) stop 27
+  if (trailz(u8) /= trailz(18744625769701376u_8)) stop 27
+  if (popcnt(i8) /= popcnt(u8)) stop 29
+  if (popcnt(u8) /= popcnt(18744625769701376u_8)) stop 29
+  if (poppar(i8) /= poppar(u8)) stop 31
+  if (poppar(u8) /= poppar(18744625769701376u_8)) stop 31
+  i16 = 1267650600228229401496703205392_16
+  u16 = 1267650600228229401496703205392u_16
+  if (leadz(i16) /= leadz(u16)) stop 33
+  if (leadz(u16) /= leadz(1267650600228229401496703205392u_16)) stop 33
+  if (trailz(i16) /= trailz(u16)) stop 35
+  if (trailz(u16) /= trailz(1267650600228229401496703205392u_16)) stop 35
+  if (popcnt(i16) /= popcnt(u16)) stop 37
+  if (popcnt(u16) /= popcnt(1267650600228229401496703205392u_16)) stop 37
+  if (poppar(i16) /= poppar(u16)) stop 39
+  if (poppar(u16) /= poppar(1267650600228229401496703205392u_16)) stop 39
+
+end program memain

Reply via email to