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