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

Themos Tsikas <themos.tsikas at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |themos.tsikas at gmail dot com

--- Comment #3 from Themos Tsikas <themos.tsikas at gmail dot com> ---
For the benefit of others which encounter this bug, a workaround is presented
below:

     Module mdb_proc
      Implicit None
      Abstract Interface
        Subroutine p(tx, r)
          Real, Intent (In) :: tx(*)
          Real, Intent (Out) :: r
        End Subroutine
      End Interface

      Type mdb_proc_t
        Character (32) :: cname
        Integer :: mode = 0
        Procedure (p), Pointer, Nopass :: f
      End Type

      Integer, Parameter :: nprocmax = 2
      Type (mdb_proc_t), Target :: listproc(1:nprocmax)

    End Module

    Subroutine test(tx, r)
      Use mdb_proc, Only: mdb_proc_t, listproc, p
      Implicit None
      Real, Intent (In) :: tx(*)
      Real, Intent (Out) :: r
      Type (mdb_proc_t), Pointer :: my_proc

      my_proc => listproc(1)
!     Call my_proc%f(tx,r)
      Call workaround(pp=my_proc%f, tx=tx, r=r)
      Print '(EN12.3)', r
    Contains
      Subroutine workaround(pp, tx, r)
        Procedure (p) :: pp
        Real, Intent (In) :: tx(*)
        Real, Intent (Out) :: r

        Call pp(tx, r)
      End Subroutine
    End Subroutine

    Program main
      Use mdb_proc, Only:mdb_proc_t, listproc

      Real, Allocatable :: z(:)
      Integer :: nz

      listproc(1) = mdb_proc_t('a', 1, p1)

      Allocate (z(0))
      nz = 0
      Call test(z, r)
      Deallocate (z)
      Allocate (z(1))
      z = 42.
      nz = 1
      Call test(z, r)
    Contains
      Subroutine p1(tx, r)
        Real, Intent (In) :: tx(*)
        Real, Intent (Out) :: r

        r = maxval(tx(1:nz))
      End Subroutine
    End Program

Reply via email to