Commit Graph

3 Commits

Author SHA1 Message Date
Jakub Jelinek 8c73c99b6a 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  <jakub@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.
2025-05-08 09:36:30 +02:00
Jakub Jelinek 6441eb6dc0 Update copyright years. 2025-01-02 11:59:57 +01:00
Thomas Koenig c0002a675a Implement MAXLOC and MINLOC for unsigned.
gcc/fortran/ChangeLog:

	* check.cc (gfc_check_minloc_maxloc): Handle BT_UNSIGNED.
	* trans-intrinsic.cc (gfc_conv_intrinsic_minmaxloc): Likewise.
	* gfortran.texi: Document MAXLOC and MINLOC for UNSIGNED.

libgfortran/ChangeLog:

	* Makefile.am: Add files for unsigned MINLOC and MAXLOC.
	* Makefile.in: Regenerated.
	* gfortran.map: Add files for unsigned MINLOC and MAXLOC.
	* generated/maxloc0_16_m1.c: New file.
	* generated/maxloc0_16_m16.c: New file.
	* generated/maxloc0_16_m2.c: New file.
	* generated/maxloc0_16_m4.c: New file.
	* generated/maxloc0_16_m8.c: New file.
	* generated/maxloc0_4_m1.c: New file.
	* generated/maxloc0_4_m16.c: New file.
	* generated/maxloc0_4_m2.c: New file.
	* generated/maxloc0_4_m4.c: New file.
	* generated/maxloc0_4_m8.c: New file.
	* generated/maxloc0_8_m1.c: New file.
	* generated/maxloc0_8_m16.c: New file.
	* generated/maxloc0_8_m2.c: New file.
	* generated/maxloc0_8_m4.c: New file.
	* generated/maxloc0_8_m8.c: New file.
	* generated/maxloc1_16_m1.c: New file.
	* generated/maxloc1_16_m2.c: New file.
	* generated/maxloc1_16_m4.c: New file.
	* generated/maxloc1_16_m8.c: New file.
	* generated/maxloc1_4_m1.c: New file.
	* generated/maxloc1_4_m16.c: New file.
	* generated/maxloc1_4_m2.c: New file.
	* generated/maxloc1_4_m4.c: New file.
	* generated/maxloc1_4_m8.c: New file.
	* generated/maxloc1_8_m1.c: New file.
	* generated/maxloc1_8_m16.c: New file.
	* generated/maxloc1_8_m2.c: New file.
	* generated/maxloc1_8_m4.c: New file.
	* generated/maxloc1_8_m8.c: New file.
	* generated/minloc0_16_m1.c: New file.
	* generated/minloc0_16_m16.c: New file.
	* generated/minloc0_16_m2.c: New file.
	* generated/minloc0_16_m4.c: New file.
	* generated/minloc0_16_m8.c: New file.
	* generated/minloc0_4_m1.c: New file.
	* generated/minloc0_4_m16.c: New file.
	* generated/minloc0_4_m2.c: New file.
	* generated/minloc0_4_m4.c: New file.
	* generated/minloc0_4_m8.c: New file.
	* generated/minloc0_8_m1.c: New file.
	* generated/minloc0_8_m16.c: New file.
	* generated/minloc0_8_m2.c: New file.
	* generated/minloc0_8_m4.c: New file.
	* generated/minloc0_8_m8.c: New file.
	* generated/minloc1_16_m1.c: New file.
	* generated/minloc1_16_m16.c: New file.
	* generated/minloc1_16_m2.c: New file.
	* generated/minloc1_16_m4.c: New file.
	* generated/minloc1_16_m8.c: New file.
	* generated/minloc1_4_m1.c: New file.
	* generated/minloc1_4_m16.c: New file.
	* generated/minloc1_4_m2.c: New file.
	* generated/minloc1_4_m4.c: New file.
	* generated/minloc1_4_m8.c: New file.
	* generated/minloc1_8_m1.c: New file.
	* generated/minloc1_8_m16.c: New file.
	* generated/minloc1_8_m2.c: New file.
	* generated/minloc1_8_m4.c: New file.
	* generated/minloc1_8_m8.c: New file.

gcc/testsuite/ChangeLog:

	* gfortran.dg/unsigned_35.f90: New test.
2024-10-07 20:40:44 +02:00