diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-08-04 13:24:43 +0200 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-08-04 13:24:43 +0200 |
commit | c918954503aa0211704c8f11022ce8ce52ebdf5d (patch) | |
tree | a6d7612cbdcf14b8cac095bacb70dcb70a97f63a /gcc | |
parent | ee47e28302a203228511de36bffeef3b7d7e14ef (diff) | |
download | gcc-c918954503aa0211704c8f11022ce8ce52ebdf5d.zip gcc-c918954503aa0211704c8f11022ce8ce52ebdf5d.tar.gz gcc-c918954503aa0211704c8f11022ce8ce52ebdf5d.tar.bz2 |
Added BOZ support to UINT.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/check.cc | 3 | ||||
-rw-r--r-- | gcc/fortran/expr.cc | 4 | ||||
-rw-r--r-- | gcc/fortran/simplify.cc | 2 | ||||
-rw-r--r-- | 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 b07de09..360d06f 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 b47a84a..226e9da 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 0f4f8f5..5bedab3 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 5caffee..677fddd 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 |