aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2024-08-04 13:24:43 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-08-04 13:24:43 +0200
commitc918954503aa0211704c8f11022ce8ce52ebdf5d (patch)
treea6d7612cbdcf14b8cac095bacb70dcb70a97f63a /gcc
parentee47e28302a203228511de36bffeef3b7d7e14ef (diff)
downloadgcc-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.cc3
-rw-r--r--gcc/fortran/expr.cc4
-rw-r--r--gcc/fortran/simplify.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/unsigned_6.f902
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