https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120158
--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-15 branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>: https://gcc.gnu.org/g:d4fd651d23b007fc9cd93a9300afab21d6dec2ee commit r15-9641-gd4fd651d23b007fc9cd93a9300afab21d6dec2ee Author: Jakub Jelinek <ja...@redhat.com> Date: Thu May 8 09:36:30 2025 +0200 libfortran: Fix up maxval/maxloc for UNSIGNED [PR120158] 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 <ja...@redhat.com> 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. (cherry picked from commit 8c73c99b6a8c3a562fef360bc269bd60bab36076)