! { dg-do compile }
!
! Tests the fix for PR78108 in which an error was triggered by the
! generic operator being resolved more than once in submodules. This
! test checks that the error is triggered when the specific procedure
! really is inserted more than once in the interface.
!
! Note that adding the extra interface to the module produces two
! errors; the one below and 'Duplicate EXTERNAL attribute specified at (1)'
!
! Contributed by Damian Rouson  <damian@sourceryinstitute.org>
!
module foo_interface
  implicit none
  type foo
    integer :: x
  contains
    procedure :: add
    generic :: operator(+) => add
    procedure :: mult
    generic :: operator(*) => mult
  end type
  interface
    integer module function add(lhs,rhs)
      implicit none
      class(foo), intent(in) :: lhs,rhs
    end function
    integer module function mult(lhs,rhs)
      implicit none
      class(foo), intent(in) :: lhs,rhs
    end function
  end interface
end module
submodule(foo_interface) foo_implementation
  interface operator (+)
    integer module function add(lhs,rhs)
      implicit none
      class(foo), intent(in) :: lhs,rhs
    end function    ! { dg-error "is already present in the interface" }
  end interface
contains
    integer module function add(lhs,rhs)
      implicit none
      class(foo), intent(in) :: lhs,rhs
      add = lhs % x + rhs % x
    end function
    integer module function mult(lhs,rhs)
      implicit none
      class(foo), intent(in) :: lhs,rhs
      mult = lhs % x * rhs % x
    end function
end submodule

  use foo_interface
  type(foo) :: a = foo (42)
  type(foo) :: b = foo (99)
  if (a + b .ne. 141) STOP 1
  if (a * b .ne. 4158) STOP 2
end
