aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-intrinsic.cc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2024-09-29 16:52:51 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-10-01 18:42:37 +0200
commit9dd9a06940a37e82d13ccd2be0c4ef68bca29750 (patch)
tree3622002cb007c51cd0038b7d8c9c03c9887a73b0 /gcc/fortran/trans-intrinsic.cc
parentbe2f7a1871ae7a256f34393eeba583ff575cb7e8 (diff)
downloadgcc-9dd9a06940a37e82d13ccd2be0c4ef68bca29750.zip
gcc-9dd9a06940a37e82d13ccd2be0c4ef68bca29750.tar.gz
gcc-9dd9a06940a37e82d13ccd2be0c4ef68bca29750.tar.bz2
Implement MAXVAL and MINVAL for UNSIGNED.
gcc/fortran/ChangeLog: * check.cc (int_or_real_or_char_or_unsigned_check_f2003): New function. (gfc_check_minval_maxval): Use it. * trans-intrinsic.cc (gfc_conv_intrinsic_minmaxval): Handle initial values for UNSIGNED. * gfortran.texi: Document MINVAL and MAXVAL for unsigned. libgfortran/ChangeLog: * Makefile.am: Add minval and maxval files. * Makefile.in: Regenerated. * gfortran.map: Add new functions. * generated/maxval_m1.c: New file. * generated/maxval_m16.c: New file. * generated/maxval_m2.c: New file. * generated/maxval_m4.c: New file. * generated/maxval_m8.c: New file. * generated/minval_m1.c: New file. * generated/minval_m16.c: New file. * generated/minval_m2.c: New file. * generated/minval_m4.c: New file. * generated/minval_m8.c: New file. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_34.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-intrinsic.cc')
-rw-r--r--gcc/fortran/trans-intrinsic.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 5505a21..e065e31 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -6443,6 +6443,15 @@ gfc_conv_intrinsic_minmaxval (gfc_se * se, gfc_expr * expr, enum tree_code op)
tmp = gfc_conv_mpz_to_tree (gfc_integer_kinds[n].huge, expr->ts.kind);
break;
+ case BT_UNSIGNED:
+ /* For MAXVAL, the minimum is zero, for MINVAL it is HUGE(). */
+ if (op == GT_EXPR)
+ tmp = build_int_cst (type, 0);
+ else
+ tmp = gfc_conv_mpz_unsigned_to_tree (gfc_unsigned_kinds[n].huge,
+ expr->ts.kind);
+ break;
+
default:
gcc_unreachable ();
}
@@ -6450,8 +6459,9 @@ gfc_conv_intrinsic_minmaxval (gfc_se * se, gfc_expr * expr, enum tree_code op)
/* We start with the most negative possible value for MAXVAL, and the most
positive possible value for MINVAL. The most negative possible value is
-HUGE for BT_REAL and (-HUGE - 1) for BT_INTEGER; the most positive
- possible value is HUGE in both cases. */
- if (op == GT_EXPR)
+ possible value is HUGE in both cases. BT_UNSIGNED has already been dealt
+ with above. */
+ if (op == GT_EXPR && expr->ts.type != BT_UNSIGNED)
{
tmp = fold_build1_loc (input_location, NEGATE_EXPR, TREE_TYPE (tmp), tmp);
if (huge_cst)