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

commit c918954503aa0211704c8f11022ce8ce52ebdf5d
Author: Thomas Koenig <tkoe...@gcc.gnu.org>
Date:   Sun Aug 4 13:24:43 2024 +0200

    Added BOZ support to UINT.

Diff:
---
 gcc/fortran/check.cc                     | 3 +++
 gcc/fortran/expr.cc                      | 4 +---
 gcc/fortran/simplify.cc                  | 2 +-
 gcc/testsuite/gfortran.dg/unsigned_6.f90 | 2 ++
 4 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index b07de09b6671..360d06f2532c 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -483,6 +483,9 @@ gfc_boz2uint (gfc_expr *x, int kind)
       mpz_and (x->value.integer, x->value.integer, gfc_unsigned_kinds[k].huge);
     }
 
+  x->ts.type = BT_UNSIGNED;
+  x->ts.kind = kind;
+
   /* Clear boz info.  */
   x->boz.rdx = 0;
   x->boz.len = 0;
diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc
index b47a84ae1a93..226e9da9a44c 100644
--- a/gcc/fortran/expr.cc
+++ b/gcc/fortran/expr.cc
@@ -297,6 +297,7 @@ gfc_copy_expr (gfc_expr *p)
       switch (q->ts.type)
        {
        case BT_INTEGER:
+       case BT_UNSIGNED:
          mpz_init_set (q->value.integer, p->value.integer);
          break;
 
@@ -351,9 +352,6 @@ gfc_copy_expr (gfc_expr *p)
          strncpy (q->boz.str, p->boz.str, p->boz.len);
          break;
 
-       case BT_UNSIGNED:
-         gfc_internal_error ("Unsigned not yet implemented");
-
        case BT_PROCEDURE:
         case BT_VOID:
            /* Should never be reached.  */
diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc
index 0f4f8f506492..5bedab3f3f4d 100644
--- a/gcc/fortran/simplify.cc
+++ b/gcc/fortran/simplify.cc
@@ -3752,7 +3752,7 @@ gfc_simplify_uint (gfc_expr *e, gfc_expr *k)
   /* Convert BOZ to integer, and return without range checking.  */
   if (e->ts.type == BT_BOZ)
     {
-      if (!gfc_boz2int (e, kind))
+      if (!gfc_boz2uint (e, kind))
        return NULL;
       result = gfc_copy_expr (e);
       return result;
diff --git a/gcc/testsuite/gfortran.dg/unsigned_6.f90 
b/gcc/testsuite/gfortran.dg/unsigned_6.f90
index 5caffeee7ab1..677fdddec214 100644
--- a/gcc/testsuite/gfortran.dg/unsigned_6.f90
+++ b/gcc/testsuite/gfortran.dg/unsigned_6.f90
@@ -16,4 +16,6 @@ program main
   if (uint(r) /= 5u) error stop 5
   c = (6.2,-1.2)
   if (uint(c) /= 6u) error stop 6
+
+  if (uint(z'ff') /= 255u) error stop 7
 end program main

Reply via email to