[libfortran] PR95647 operator(.eq.) and operator(==) treated differently

Message ID 7838faa1-6549-c85f-7131-e0a7bd124957@charter.net
State New
Headers show
Series
  • [libfortran] PR95647 operator(.eq.) and operator(==) treated differently
Related show

Commit Message

Jerry DeLisle Feb. 12, 2021, 3:02 a.m.
The attached patch is another provided from Steve Kargle in the PR report.

I have created a test case and regression tested the result.

OK for trunk?

Regards,

Jerry

libgfortran: Fix PR95647 by changing the interfaces of operators .eq. 
and .ne.

The FE converts the old school .eq. to ==,
and then tracks the ==.  The module starts with == and so it does not
properly overload the .eq.  Reversing the interfaces fixes this.

2021-02-11  Steve Kargl <sgk@troutmask.apl.washington.edu>

libgfortran/ChangeLog:

     PR libfortran 95647
     * ieee/ieee_arithmetic.F90: Flip interfaces of operators .eq. to
     == and .ne. to /= .

gcc/testsuite/ChangeLog:

     PR libfortran 95647
     * gfortran.dg/ieee/ieee_arithmetic: New test.

Comments

Tobias Burnus Feb. 12, 2021, 7:50 a.m. | #1
Hi Jerry,

On 12.02.21 04:02, Jerry DeLisle wrote:
> The attached patch is another provided from Steve Kargle in the PR

> report.

> I have created a test case and regression tested the result.

>

> OK for trunk?

LGTM except:
> libgfortran/ChangeLog:

>

>     PR libfortran 95647


Syntax is "PR <component>/<number", i.e. there should be a '/' before
the number.

Thanks,

Tobias

>     * ieee/ieee_arithmetic.F90: Flip interfaces of operators .eq. to

>     == and .ne. to /= .

>

> gcc/testsuite/ChangeLog:

>

>     PR libfortran 95647

>     * gfortran.dg/ieee/ieee_arithmetic: New test.

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf
Jerry DeLisle Feb. 12, 2021, 4:35 p.m. | #2
How do I get permissions set so that I can change status of bug reports 
and assign to myself.  My permissions got dissolved during some 
evolution in the last year.

also

The master branch has been updated by Jerry DeLisle<jvdelisle@gcc.gnu.org>:

https://gcc.gnu.org/g:0631e008adc759cc801d0d034224ee6b4bcf31aa

commit r11-7225-g0631e008adc759cc801d0d034224ee6b4bcf31aa
Author: Steve Kargl<sgk@troutmask.apl.washington.edu>
Date:   Fri Feb 12 07:58:16 2021 -0800



On 2/11/21 7:02 PM, Jerry DeLisle wrote:
> The attached patch is another provided from Steve Kargle in the PR 

> report.

>

> I have created a test case and regression tested the result.

>

> OK for trunk?

>

> Regards,

>

> Jerry

>

> libgfortran: Fix PR95647 by changing the interfaces of operators .eq. 

> and .ne.

>

> The FE converts the old school .eq. to ==,

> and then tracks the ==.  The module starts with == and so it does not

> properly overload the .eq.  Reversing the interfaces fixes this.

>

> 2021-02-11  Steve Kargl <sgk@troutmask.apl.washington.edu>

>

> libgfortran/ChangeLog:

>

>     PR libfortran 95647

>     * ieee/ieee_arithmetic.F90: Flip interfaces of operators .eq. to

>     == and .ne. to /= .

>

> gcc/testsuite/ChangeLog:

>

>     PR libfortran 95647

>     * gfortran.dg/ieee/ieee_arithmetic: New test.

>

Patch

diff --git a/gcc/testsuite/gfortran.dg/ieee/ieee_12.f90 b/gcc/testsuite/gfortran.dg/ieee/ieee_12.f90
new file mode 100644
index 00000000000..139a70142b8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/ieee/ieee_12.f90
@@ -0,0 +1,24 @@ 
+! { dg-do run }
+! PR95647 operator(.eq.) and operator(==) treated differently
+program test
+  use, intrinsic :: ieee_arithmetic, only :                 &
+&                ieee_class,                                       &
+&                ieee_class_type,                                  &
+&                ieee_negative_normal,                             &
+&                ieee_positive_normal,                             &
+&                operator(.eq.), operator(.ne.)
+  integer :: good
+  real(4) r4
+  type(ieee_class_type) class1
+  good = 0
+  r4 = 1.0
+  class1 = ieee_class(r4)
+  if (class1 .eq. ieee_positive_normal) good = good + 1
+  if (class1 .ne. ieee_negative_normal) good = good + 1
+  r4 = -1.0
+  class1 = ieee_class(r4)
+  if (class1 .eq. ieee_negative_normal) good = good + 1
+  if (class1 .ne. ieee_positive_normal) good = good + 1
+  if (good /= 4) call abort
+end program test
+
diff --git a/libgfortran/ieee/ieee_arithmetic.F90 b/libgfortran/ieee/ieee_arithmetic.F90
index 55992232ce2..35a16938f8e 100644
--- a/libgfortran/ieee/ieee_arithmetic.F90
+++ b/libgfortran/ieee/ieee_arithmetic.F90
@@ -77,15 +77,16 @@  module IEEE_ARITHMETIC
 
 
   ! Equality operators on the derived types
-  interface operator (==)
+  ! Note, the FE overloads .eq. to == and .ne. to /=
+  interface operator (.eq.)
     module procedure IEEE_CLASS_TYPE_EQ, IEEE_ROUND_TYPE_EQ
   end interface
-  public :: operator(==)
+  public :: operator(.eq.)
 
-  interface operator (/=)
+  interface operator (.ne.)
     module procedure IEEE_CLASS_TYPE_NE, IEEE_ROUND_TYPE_NE
   end interface
-  public :: operator (/=)
+  public :: operator (.ne.)
 
 
   ! IEEE_IS_FINITE