From 0631e008adc759cc801d0d034224ee6b4bcf31aa Mon Sep 17 00:00:00 2001 From: Steve Kargl Date: Fri, 12 Feb 2021 07:58:16 -0800 Subject: [PATCH] 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-12 Steve Kargl 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_12.f90: New test. --- gcc/testsuite/gfortran.dg/ieee/ieee_12.f90 | 24 ++++++++++++++++++++++ libgfortran/ieee/ieee_arithmetic.F90 | 9 ++++---- 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/ieee/ieee_12.f90 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 -- 2.30.2