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  <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))
2021-11-06  Manfred Schwarb  <manfre...@gmx.ch>

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 <manfred99 at gmx dot ch>
 ! 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
+++ b/gcc/testsuite/gfortran.dg/pr91497_2.f90
@@ -0,0 +1,124 @@
+! { dg-do compile }
+! { 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.
+! Additional test case to cover all targets.
+!
+program foo
+
+      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(e=123_2)
+      PARAMETER(f=123_4)
+      PARAMETER(g=123_8)
+
+      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)
+      bb=DFLOAT(g)
+      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)
+      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)
+      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)'
+
+      ee=NINT(a, kind=2)
+      ee=NINT(b, kind=2)
+      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)
+      ee=IDNINT(b)
+      ff=IDNINT(b)
+      gg=IDNINT(b)
+
+      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

Reply via email to