http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59069

            Bug ID: 59069
           Summary: Bogus error wording for passing array to scalar
                    dummies with user-defined operator
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org

The following error message is very misleading. The problem is not the type but
that the operands are arrays and the user-defined operator is not elemental:

  print *, any( many == single )
                1
Error: Operands of comparison operator '==' at (1) are
TYPE(latvec)/TYPE(latvec)


Found at https://groups.google.com/forum/#!topic/comp.lang.fortran/tuy1wUmVBkY


module Overloading
  implicit none

  type Latvec
    integer :: hkl(3)
  end type Latvec

  interface operator (==)
    procedure :: Latvec_equals
  end interface operator (==)

  contains

  pure function Latvec_equals(latvec1, latvec2) result(equals)

    implicit none

    type(Latvec), intent(in) :: latvec1, latvec2
    logical :: equals

    equals = all(latvec1%hkl == latvec2%hkl)

  end function Latvec_equals

end module Overloading

program Main
  use Overloading

  implicit none

  type(Latvec) :: many(2) = [ Latvec([0,0,1]), Latvec([0,0,2]) ]
  type(Latvec) :: single = Latvec([0,0,1])

  ! these work just fine
  print *, single == many(1)
  print *, single == many(2)

  ! this gives the compilation error:
  ! Operands of comparison operator '==' at (1) are TYPE(latvec)/TYPE(latvec)
  print *, any( many == single )
end program Main

Reply via email to