https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107742

            Bug ID: 107742
           Summary: class mismatch in passed procedure
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jwmwalrus at gmail dot com
  Target Milestone: ---

Hi.

The code below throws the following error:

   51 |         if (this%match(my_proc, 5)) continue
      |                       1
Error: Interface mismatch in dummy procedure ‘proc’ at (1): Type mismatch in
argument 'this' (CLASS(a)/CLASS(b))


----------8<----------
module mod1
    type, abstract :: a
    contains
        procedure(i_match), deferred :: match
    end type

    abstract interface
        subroutine i_proc(this, i)
            import
            class(a), intent(inout) :: this
            integer, intent(in) :: i
        end subroutine
        function i_match(this, proc, i) result(cond)
            import
            logical :: cond
            class(a), intent(inout) :: this
            procedure(i_proc) :: proc
            integer, intent(in) :: i
        end function
    end interface

    type, extends(a) :: b
    contains
        procedure :: match => match_b
        procedure :: exec
    end type

    interface
        module subroutine exec(this)
            class(b), intent(inout) :: this
        end subroutine
    end interface
contains
    function match_b(this, proc, i) result(cond)
        logical :: cond
        class(b), intent(inout) :: this
        procedure(i_proc) :: proc
        integer, intent(in) :: i
        call proc(this, i)
        cond = .true.
    end function
    subroutine my_proc(this, i)
        class(b), intent(inout) :: this
        integer, intent(in) :: i
    end subroutine
end module

submodule (mod1) smod1
contains
    module procedure exec
        if (this%match(my_proc, 5)) continue
    end procedure
end submodule
---------->8----------


Since type b extends type a, doesn't my_proc satisfy the i_proc interface?

Reply via email to