Si un procedimiento de tipo enlazado que es privado en un módulo foo es anulado (o intenta anularse) por un tipo en un segundo módulo bar, ¿cómo se resuelve esto? ¿Hay alguna especificación en la norma? Teniendo en cuenta que el siguiente código de ejemplo, dependiendo del compilador, imprime FOO (intel fortan 19.1.1) o BAR (gfortran 7.5, ¿tal vez una versión más reciente da resultados diferentes?), Me pregunto cuál es la correcta.

module foo

type :: foo_t
contains
    procedure, private :: foobar
    procedure :: exec
end type foo_t

contains

    subroutine exec(obj)
        class(foo_t) :: obj
        call obj%foobar()
    end subroutine exec

    subroutine foobar(this)
        class(foo_t) :: this
        print *, "FOO"
    end subroutine foobar
end module foo

module bar
    use foo

    type, extends(foo_t) :: bar_t
    contains
        procedure :: foobar => impl
    end type bar_t

contains

    subroutine impl(this)
        class(bar_t) :: this
        print *, "BAR"
    end subroutine impl
end module bar

program test
    use foo
    use bar

    class(foo_t), allocatable :: inst
    allocate( bar_t :: inst)
    call inst%exec()
end program test

Además, ¿es posible extender un tipo abstracto con un método diferido privado en un módulo diferente, como sería el caso en el ejemplo si foobar fuera diferido (que solo se compila con el compilador gfortran mencionado anteriormente y luego produce el resultado esperado, pero la pregunta es si este también es el comportamiento correcto)?

4
Kai Guther 28 ago. 2020 a las 18:43

1 respuesta

La mejor respuesta

El resultado correcto es FOO.

Este es un error conocido en gfortran (https://gcc.gnu.org/ bugzilla / show_bug.cgi? id = 47805).

No se puede acceder a un enlace privado en otro módulo. Debido a que el enlace privado no es accesible en el módulo bar, no se anula (F2018 7.5.7.3p1). La definición de enlace en bar_t no está relacionada con el enlace en foo_t.

(Un tipo abstracto con un enlace diferido privado no se puede utilizar fuera del módulo que lo define. Consulte la interpretación F08 / 0052 para obtener más detalles).

4
IanH 29 ago. 2020 a las 02:18