From 8c73c99b6a8c3a562fef360bc269bd60bab36076 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 8 May 2025 09:36:30 +0200 Subject: libfortran: Fix up maxval/maxloc for UNSIGNED [PR120158] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When libgfortran is compiled, there are some -Woverflow warnings like ../../../libgfortran/generated/maxloc0_4_m1.c:99:14: warning: unsigned conversion from ‘int’ to ‘GFC_UINTEGER_1’ {aka ‘unsigned char’} changes value from ‘-255’ to ‘1’ [-Woverflow] 99 | maxval = -GFC_UINTEGER_1_HUGE; | ^ and those actually point a bug in the maxloc*/maxval* implementation for UNSIGNED. The intent of #if defined ('atype_inf`) result = -atype_inf; #else result = atype_min; #endif (or similar for maxval) is to initialize the variable with minimum value of the type, if the type has infinities, then negative infinity, otherwise the minimum (normalized) value. atype_min expands for signed integers to say (-GFC_INTEGER_4_HUGE-1) or for floating point to say -GFC_REAL_8_HUGE. For UNSIGNED it expands to e.g. -GFC_UINTEGER_4_HUGE, but that is -0xffffffffU which is 1U, while the minimum value of the type is 0. Haven't tried to construct testcases for that, but I believe e.g. maskval could return incorrectly 1 on an array (or masked array) full of 0s, or maxloc could identify incorrectly the maximum location. The following patch makes sure atype_min expands to 0 for atype_name GFC_UINTEGER*. 2025-05-07 Jakub Jelinek PR libfortran/120158 * m4/iparm.m4 (atype_min): For atype_name starting with GFC_UINTEGER define to 0. * generated/maxloc0_16_m1.c: Regenerate. * generated/maxloc0_16_m2.c: Regenerate. * generated/maxloc0_16_m4.c: Regenerate. * generated/maxloc0_16_m8.c: Regenerate. * generated/maxloc0_16_m16.c: Regenerate. * generated/maxloc0_4_m1.c: Regenerate. * generated/maxloc0_4_m2.c: Regenerate. * generated/maxloc0_4_m4.c: Regenerate. * generated/maxloc0_4_m8.c: Regenerate. * generated/maxloc0_4_m16.c: Regenerate. * generated/maxloc0_8_m1.c: Regenerate. * generated/maxloc0_8_m2.c: Regenerate. * generated/maxloc0_8_m4.c: Regenerate. * generated/maxloc0_8_m8.c: Regenerate. * generated/maxloc0_8_m16.c: Regenerate. * generated/maxloc1_16_m1.c: Regenerate. * generated/maxloc1_16_m2.c: Regenerate. * generated/maxloc1_16_m4.c: Regenerate. * generated/maxloc1_16_m8.c: Regenerate. * generated/maxloc1_16_m16.c: Regenerate. * generated/maxloc1_4_m1.c: Regenerate. * generated/maxloc1_4_m2.c: Regenerate. * generated/maxloc1_4_m4.c: Regenerate. * generated/maxloc1_4_m8.c: Regenerate. * generated/maxloc1_4_m16.c: Regenerate. * generated/maxloc1_8_m1.c: Regenerate. * generated/maxloc1_8_m2.c: Regenerate. * generated/maxloc1_8_m4.c: Regenerate. * generated/maxloc1_8_m8.c: Regenerate. * generated/maxloc1_8_m16.c: Regenerate. * generated/maxval_m1.c: Regenerate. * generated/maxval_m2.c: Regenerate. * generated/maxval_m4.c: Regenerate. * generated/maxval_m8.c: Regenerate. * generated/maxval_m16.c: Regenerate. --- libgfortran/generated/maxval_m4.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'libgfortran/generated/maxval_m4.c') diff --git a/libgfortran/generated/maxval_m4.c b/libgfortran/generated/maxval_m4.c index 6d660d8..3b1e79a 100644 --- a/libgfortran/generated/maxval_m4.c +++ b/libgfortran/generated/maxval_m4.c @@ -143,10 +143,10 @@ maxval_m4 (gfc_array_m4 * const restrict retarray, #if defined (GFC_UINTEGER_4_INFINITY) result = -GFC_UINTEGER_4_INFINITY; #else - result = -GFC_UINTEGER_4_HUGE; + result = 0; #endif if (len <= 0) - *dest = -GFC_UINTEGER_4_HUGE; + *dest = 0; else { #if ! defined HAVE_BACK_ARG @@ -351,7 +351,7 @@ mmaxval_m4 (gfc_array_m4 * const restrict retarray, #if defined (GFC_UINTEGER_4_INFINITY) result = -GFC_UINTEGER_4_INFINITY; #else - result = -GFC_UINTEGER_4_HUGE; + result = 0; #endif #if defined (GFC_UINTEGER_4_QUIET_NAN) int non_empty_p = 0; @@ -372,9 +372,9 @@ mmaxval_m4 (gfc_array_m4 * const restrict retarray, if (unlikely (n >= len)) { #if defined (GFC_UINTEGER_4_QUIET_NAN) - result = non_empty_p ? GFC_UINTEGER_4_QUIET_NAN : -GFC_UINTEGER_4_HUGE; + result = non_empty_p ? GFC_UINTEGER_4_QUIET_NAN : 0; #else - result = -GFC_UINTEGER_4_HUGE; + result = 0; #endif } else for (; n < len; n++, src += delta, msrc += mdelta) @@ -535,7 +535,7 @@ smaxval_m4 (gfc_array_m4 * const restrict retarray, while(1) { - *dest = -GFC_UINTEGER_4_HUGE; + *dest = 0; count[0]++; dest += dstride[0]; n = 0; -- cgit v1.1