https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120158

--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:8c73c99b6a8c3a562fef360bc269bd60bab36076

commit r16-468-g8c73c99b6a8c3a562fef360bc269bd60bab36076
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.

Reply via email to