Re: [PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
Hi Manfred, looks good to me. Thanks for the patch! Best regards Thomas
Re: [PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
Am 02.11.21 um 19:39 schrieb Thomas Koenig: > On 02.11.21 15:22, Manfred Schwarb wrote: >> Am 02.11.21 um 14:26 schrieb Thomas Koenig: >>> Hi Manfred, >>> 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. >>> Two points: >>> >>> We should modify existing test cases only when necessary, because >>> modification can impede a regression test. It is better to create >>> a new one. >>> I only changed the test case to use dg-require-effective-target and real(n) notation now. Added a second case without real(10) and real(16), but for all targets, which covers MIN1 and MAX1 too. >> >> Yes, but this was a quick-and-dirty test of mine, and I realized only >> afterwards >> that Steve had used it as-is. The new testcase is more consistent and more >> complete. >> Sandra got errors on targets without REAL(16) support and requested changes, >> so I decided to split it. >> >> So you want me to "split" it in 3 parts? >> - existing test as is, only for targets with REAL(16) support >> - additional tests incl. complex intrinsics for targets with REAL(16) support >> - additional tests incl. complex intrinsics for all targets, only single and >> double precision >> >> OTOH, it is perhaps not worth the trouble to do REAL(10) and REAL(16) tests, >> either >> it warns or it does not. > > Anything that tests both complex and REAL(16) is fine by me. I don't > think you need to test the combination of COMPLEX(16), both > codepaths have been seen by that time :-) > > Or you can split it three ways, like you wrote above. > >>> While we do recognize real*4 and real*8 and so on, these are >>> non-standard extensions, and I would like to avoid to have these >>> with new test cases. >>> >>> Instead of real*8, you can use real(8) or double precision. >>> >> >> Well, double precision is deprecated AFAIK. > > Not in Fortran 2018. > > Best regards > > Thomas > 2021-11-06 Manfred Schwarb 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)) 2021-11-06 Manfred Schwarb gcc/testsuite/ChangeLog: PR fortran/91497 * gfortran.dg/pr91497.f90: Adjust test to use dg-require-effective-target directive. * gfortran.dg/pr91497_2.f90: New test to cover all targets. Cover MAX1 and MIN1 intrinsics. --- a/gcc/testsuite/gfortran.dg/pr91497.f90 +++ b/gcc/testsuite/gfortran.dg/pr91497.f90 @@ -1,4 +1,6 @@ -! { dg-do compile { target { i?86-*-* x86_64-*-* } } } +! { 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 ! PR fortran/91497 @@ -8,13 +10,13 @@ ! 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 + real(10) c,cc + real(16) d + integer(2) e,ee + integer(4) f,ff + integer(8) g,gg PARAMETER(a=3.1415927_4) PARAMETER(b=3.1415927_8) PARAMETER(c=3.1415927_10) @@ -36,11 +38,10 @@ program foo aa=CEILING(b) aa=CEILING(c) aa=CEILING(d) - !---unknown but documented type conversions: + !---DEC specific type conversions (-fdec): !!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) @@ -98,7 +99,7 @@ program foo ff=IFIX(a) ff=IDINT(b) ff=IDNINT(b) - !---LONG not allowed anymore in gfortran 10 (?): + !---LONG support got removed: !!ff=LONG(a) !!ff=LONG(b) !!ff=LONG(c) --- /dev/null
Re: [PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
On 02.11.21 15:22, Manfred Schwarb wrote: Am 02.11.21 um 14:26 schrieb Thomas Koenig: Hi Manfred, 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. Two points: We should modify existing test cases only when necessary, because modification can impede a regression test. It is better to create a new one. Yes, but this was a quick-and-dirty test of mine, and I realized only afterwards that Steve had used it as-is. The new testcase is more consistent and more complete. Sandra got errors on targets without REAL(16) support and requested changes, so I decided to split it. So you want me to "split" it in 3 parts? - existing test as is, only for targets with REAL(16) support - additional tests incl. complex intrinsics for targets with REAL(16) support - additional tests incl. complex intrinsics for all targets, only single and double precision OTOH, it is perhaps not worth the trouble to do REAL(10) and REAL(16) tests, either it warns or it does not. Anything that tests both complex and REAL(16) is fine by me. I don't think you need to test the combination of COMPLEX(16), both codepaths have been seen by that time :-) Or you can split it three ways, like you wrote above. While we do recognize real*4 and real*8 and so on, these are non-standard extensions, and I would like to avoid to have these with new test cases. Instead of real*8, you can use real(8) or double precision. Well, double precision is deprecated AFAIK. Not in Fortran 2018. Best regards Thomas
Re: [PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
Am 02.11.21 um 14:26 schrieb Thomas Koenig: > Hi Manfred, > >> 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. > Two points: > > We should modify existing test cases only when necessary, because > modification can impede a regression test. It is better to create > a new one. > Yes, but this was a quick-and-dirty test of mine, and I realized only afterwards that Steve had used it as-is. The new testcase is more consistent and more complete. Sandra got errors on targets without REAL(16) support and requested changes, so I decided to split it. So you want me to "split" it in 3 parts? - existing test as is, only for targets with REAL(16) support - additional tests incl. complex intrinsics for targets with REAL(16) support - additional tests incl. complex intrinsics for all targets, only single and double precision OTOH, it is perhaps not worth the trouble to do REAL(10) and REAL(16) tests, either it warns or it does not. > While we do recognize real*4 and real*8 and so on, these are > non-standard extensions, and I would like to avoid to have these > with new test cases. > > Instead of real*8, you can use real(8) or double precision. > Well, double precision is deprecated AFAIK. > OK with these changes to the test cases. > > Thanks for the patch! > > Best regards > > Thomas
Re: [PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
Hi Manfred, 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. Two points: We should modify existing test cases only when necessary, because modification can impede a regression test. It is better to create a new one. While we do recognize real*4 and real*8 and so on, these are non-standard extensions, and I would like to avoid to have these with new test cases. Instead of real*8, you can use real(8) or double precision. OK with these changes to the test cases. Thanks for the patch! Best regards Thomas
[PATCH] PR fortran/91497 -- Silence conversion warnings for MIN1 and MAX1
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 2021-11-02 Manfred Schwarb 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 ! 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)'