Hi, In addition to the patches of Steve Kargl for PR 91497: The MIN1 and MAX1 intrinsics do explicit type conversions and should be silenced too for -Wconversion and -Wconversion-extra.
Adjust testcase to only use *4 and *8 real types, provide a second testcase for *10 and *16 precisions. Regtested on Linux x86_64. Signed-off-by Manfred Schwarb <manfre...@gmx.ch>
2021-11-02 Manfred Schwarb <manfre...@gmx.ch> gcc/testsuite/ChangeLog: PR fortran/91497 * gfortran.dg/pr91497.f90: Adjust test to only use single and double precision. Add complex intrinsics. --- a/gcc/testsuite/gfortran.dg/pr91497.f90 +++ b/gcc/testsuite/gfortran.dg/pr91497.f90 @@ -1,4 +1,4 @@ -! { dg-do compile { target { i?86-*-* x86_64-*-* } } } +! { dg-do compile } ! { dg-options "-Wall" } ! Code contributed by Manfred Schwarb <manfred99 at gmx dot ch> ! PR fortran/91497 @@ -8,120 +8,120 @@ ! program foo - real*4 a,aa - real*8 b,bb - real*10 c,cc - real*16 d - integer*2 e,ee - integer*4 f,ff - integer*8 g,gg + real*4 a, aa + real*8 b, bb + integer*2 e, ee + integer*4 f, ff + integer*8 g, gg + complex(4) ww + complex(8) xx PARAMETER(a=3.1415927_4) PARAMETER(b=3.1415927_8) - PARAMETER(c=3.1415927_10) - PARAMETER(d=3.1415927_16) PARAMETER(e=123_2) PARAMETER(f=123_4) PARAMETER(g=123_8) - aa=REAL(b) - aa=REAL(c) - aa=REAL(d) + aa=REAL(b) ! was: Change of value in conversion from 'REAL(8)' to 'REAL(4)' aa=REAL(e) aa=REAL(f) aa=REAL(g) + aa=REAL(b, kind=4) ! was: Change of value in conversion from 'REAL(8)' to 'REAL(4)' + bb=REAL(a, kind=8) + aa=FLOAT(f) - aa=FLOOR(b) - aa=FLOOR(c) - aa=FLOOR(d) - aa=CEILING(b) - aa=CEILING(c) - aa=CEILING(d) - !---unknown but documented type conversions: - !!aa=FLOATI(e) - !!aa=FLOATJ(f) - !!aa=FLOATK(g) - !---documentation is wrong for sngl: - aa=SNGL(c) - aa=SNGL(d) - bb=REAL(c, kind=8) - bb=REAL(d, kind=8) - bb=DBLE(c) - bb=DBLE(d) bb=DFLOAT(g) - bb=FLOOR(c) - bb=FLOOR(d) - bb=CEILING(c) - bb=CEILING(d) - cc=REAL(d, kind=10) - cc=FLOOR(d) - cc=CEILING(d) - - aa=AINT(b) - aa=ANINT(b) - aa=AINT(c) - aa=ANINT(c) - aa=AINT(d) - aa=ANINT(d) + aa=SNGL(b) ! was: Change of value in conversion from 'REAL(8)' to 'REAL(4)' + aa=AINT(a) + bb=AINT(b) + aa=AINT(b, kind=4) bb=DINT(b) + aa=ANINT(a) + bb=ANINT(b) + aa=ANINT(b, kind=4) bb=DNINT(b) - - ee=INT(a, kind=2) - ee=NINT(a, kind=2) - ee=INT(b, kind=2) - ee=NINT(b, kind=2) - ee=INT(c, kind=2) - ee=NINT(c, kind=2) - ee=INT(d, kind=2) - ee=NINT(d, kind=2) + !---DEC type conversions (-fdec): + !!aa=FLOATI(e) + !!aa=FLOATJ(f) + !!aa=FLOATK(g) + aa=AMAX0(f, f) + aa=AMIN0(f, f) + aa=AMAX0(g, g) + aa=AMIN0(g, g) + + ee=INT(a) + ee=INT(a, kind=2) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(2)' + ee=INT(b, kind=2) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(2)' ee=INT(f, kind=2) ee=INT(g, kind=2) + ff=INT(b) + ff=INT(a, kind=4) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(4)' + ff=INT(b, kind=4) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(4)' + ff=INT(f, kind=4) + ff=INT(g, kind=4) + gg=INT(a) + gg=INT(a, kind=8) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(8)' + gg=INT(b, kind=8) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(8)' + gg=INT(f, kind=8) + gg=INT(g, kind=8) + ee=IFIX(a) + ff=IFIX(a) + gg=IFIX(a) ee=IDINT(b) - ee=IDNINT(b) - ee=INT2(a) - ee=INT2(b) - ee=INT2(c) - ee=INT2(d) + ff=IDINT(b) + gg=IDINT(b) + ee=INT2(a) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(2)' + ee=INT2(b) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(2)' ee=INT2(f) ee=INT2(g) + gg=INT8(a) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(8)' + gg=INT8(b) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(8)' + gg=INT8(f) + gg=INT8(g) + + ff=FLOOR(b) + ee=FLOOR(b, kind=2) + ff=FLOOR(b, kind=4) + gg=FLOOR(b, kind=8) + ff=CEILING(b) + ee=CEILING(b, kind=2) + ff=CEILING(b, kind=4) + gg=CEILING(b, kind=8) + ff=MAX1(a, a) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(4)' + ff=MIN1(a, a) ! was: Change of value in conversion from 'REAL(4)' to 'INTEGER(4)' + gg=MAX1(b, b) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(4)' + gg=MIN1(b, b) ! was: Change of value in conversion from 'REAL(8)' to 'INTEGER(4)' - ff=INT(a, kind=4) + ee=NINT(a, kind=2) + ee=NINT(b, kind=2) + ff=NINT(a) + ff=NINT(b) ff=NINT(a, kind=4) - ff=INT(b, kind=4) ff=NINT(b, kind=4) - ff=INT(c, kind=4) - ff=NINT(c, kind=4) - ff=INT(d, kind=4) - ff=NINT(d, kind=4) - ff=INT(f, kind=4) - ff=INT(g, kind=4) - ff=IFIX(a) - ff=IDINT(b) - ff=IDNINT(b) - !---LONG not allowed anymore in gfortran 10 (?): - !!ff=LONG(a) - !!ff=LONG(b) - !!ff=LONG(c) - !!ff=LONG(d) - !!ff=LONG(g) - - gg=INT(a, kind=8) gg=NINT(a, kind=8) - gg=INT(b, kind=8) gg=NINT(b, kind=8) - gg=INT(c, kind=8) - gg=NINT(c, kind=8) - gg=INT(d, kind=8) - gg=NINT(d, kind=8) - gg=INT(f, kind=8) - gg=INT(g, kind=8) - gg=IFIX(a) - gg=IDINT(b) + ee=IDNINT(b) + ff=IDNINT(b) gg=IDNINT(b) - gg=INT8(a) - gg=INT8(b) - gg=INT8(c) - gg=INT8(d) - gg=INT8(g) -end + ww=COMPLEX(a, a) + ww=COMPLEX(e, e) + ww=COMPLEX(g, g) + ww=COMPLEX(a, g) + xx=COMPLEX(b, g) + ww=CMPLX(a, a) + ww=CMPLX(b, b, kind=4) + xx=CMPLX(a, a, kind=8) + + aa=REAL(ww) + bb=REAL(xx) + aa=REALPART(ww) + bb=REALPART(xx) + aa=AIMAG(ww) + bb=AIMAG(xx) + aa=IMAG(ww) + bb=IMAG(xx) + bb=DIMAG(xx) + aa=IMAGPART(ww) + bb=IMAGPART(xx) +end
2021-11-02 Manfred Schwarb <manfre...@gmx.ch> gcc/testsuite/ChangeLog: PR fortran/91497 * gfortran.dg/pr91497_2.f90: New test. --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr91497_2.f90 @@ -0,0 +1,80 @@ +! { dg-do compile } +! { dg-require-effective-target fortran_real_10 } +! { dg-require-effective-target fortran_real_16 } +! { dg-options "-Wall" } +! Code contributed by Manfred Schwarb <manfred99 at gmx dot ch> +! PR fortran/91497 +! +! Prior to applying the patch for this PR, the following code +! would generate numerous conversion warnings. +! +program foo + + real*4 cc + real*10 a, aa + real*16 b, bb + integer*2 ee + integer*4 ff + integer*8 gg + complex(10) ww + complex(16) xx + PARAMETER(a=3.1415927_10) + PARAMETER(b=3.1415927_16) + + cc=REAL(a) ! was: Change of value in conversion from 'REAL(10)' to 'REAL(4)' + cc=REAL(b) ! was: Change of value in conversion from 'REAL(16)' to 'REAL(4)' + aa=REAL(b, kind=10) ! was: Change of value in conversion from 'REAL(16)' to 'REAL(10)' + bb=REAL(a, kind=16) + + cc=SNGL(a) ! was: Change of value in conversion from 'REAL(10)' to 'REAL(4)' + cc=SNGL(b) ! was: Change of value in conversion from 'REAL(16)' to 'REAL(4)' + aa=AINT(a) + bb=AINT(b) + aa=AINT(b, kind=10) + aa=ANINT(a) + bb=ANINT(b) + aa=ANINT(b, kind=10) + + ff=INT(b) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(4)' + ff=INT(a, kind=4) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(4)' + ff=INT(b, kind=4) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(4)' + gg=INT(a, kind=8) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(8)' + gg=INT(b, kind=8) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(8)' + + ee=INT2(a) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(2)' + ee=INT2(b) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(2)' + gg=INT8(a) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(8)' + gg=INT8(b) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(8)' + + ff=FLOOR(a, kind=4) + gg=FLOOR(b, kind=8) + ff=CEILING(a, kind=4) + gg=CEILING(b, kind=8) + ff=MAX1(a, a) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(4)' + ff=MIN1(a, a) ! was: Change of value in conversion from 'REAL(10)' to 'INTEGER(4)' + gg=MAX1(b, b) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(4)' + gg=MIN1(b, b) ! was: Change of value in conversion from 'REAL(16)' to 'INTEGER(4)' + + ff=NINT(a) + ff=NINT(b) + ff=NINT(a, kind=4) + ff=NINT(b, kind=4) + gg=NINT(a, kind=8) + gg=NINT(b, kind=8) + + ww=COMPLEX(a, a) + xx=COMPLEX(b, b) + ww=CMPLX(b, b, kind=10) + xx=CMPLX(a, a, kind=16) + + aa=REAL(ww) + bb=REAL(xx) + aa=REALPART(ww) + bb=REALPART(xx) + aa=AIMAG(ww) + bb=AIMAG(xx) + aa=IMAG(ww) + bb=IMAG(xx) + aa=IMAGPART(ww) + bb=IMAGPART(xx) +end
2021-11-02 Manfred Schwarb <manfre...@gmx.ch> gcc/fortran/ChangeLog: PR fortran/91497 * simplify.c (simplify_min_max): Disable conversion warnings for MIN1 and MAX1. --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -5087,6 +5087,7 @@ min_max_choose (gfc_expr *arg, gfc_expr static gfc_expr * simplify_min_max (gfc_expr *expr, int sign) { + int tmp1, tmp2; gfc_actual_arglist *arg, *last, *extremum; gfc_expr *tmp, *ret; const char *fname; @@ -5131,7 +5132,16 @@ simplify_min_max (gfc_expr *expr, int si if ((tmp->ts.type != BT_INTEGER || tmp->ts.kind != gfc_integer_4_kind) && (strcmp (fname, "min1") == 0 || strcmp (fname, "max1") == 0)) { + /* Explicit conversion, turn off -Wconversion and -Wconversion-extra + warnings. */ + tmp1 = warn_conversion; + tmp2 = warn_conversion_extra; + warn_conversion = warn_conversion_extra = 0; + ret = gfc_convert_constant (tmp, BT_INTEGER, gfc_integer_4_kind); + + warn_conversion = tmp1; + warn_conversion_extra = tmp2; } else if ((tmp->ts.type != BT_REAL || tmp->ts.kind != gfc_real_4_kind) && (strcmp (fname, "amin0") == 0 || strcmp (fname, "amax0") == 0))