gfortran 关联了错误的类型绑定过程

gfortran associates wrong type-bound procedure

当我们编译(gfortran 5.3 或 7.2)和 运行 以下代码时,main.f03 的第 9 行在一个从未被调用的子例程中结束。谁能解释一下为什么?

main.f03:

program main
    use minimalisticcase
    implicit none

    type(DataStructure) :: data_structure
    type(DataLogger) :: data_logger

    call data_structure%init()
    call data_logger%init(data_structure)
end program

minimalisticcase.f03:

module minimalisticcase
    implicit none

    type, public :: DataStructure
        integer :: i
    contains
        procedure, pass :: init => init_data_structure
        procedure, pass :: a => beginning_of_alphabet
    end type



    type, public :: DataLogger
        type(DataStructure), pointer :: data_structure
        contains
                procedure, pass :: init => init_data_logger
                procedure, pass :: do_something => do_something
    end type

contains
    subroutine init_data_structure(self)
        implicit none
        class(DataStructure), intent(inout) :: self
        write(*,*) 'init_data_structure'
    end subroutine

    subroutine beginning_of_alphabet(self)
        implicit none
        class(DataStructure), intent(inout) :: self

        write(*,*) 'beginning_of_alphabet'
    end subroutine

    subroutine init_data_logger(self, data_structure)
        implicit none
        class(DataLogger), intent(inout) :: self
        class(DataStructure), target :: data_structure
        write(*,*) 'init_data_logger'

        self%data_structure => data_structure
        call self%do_something()
    end subroutine

    subroutine do_something(self)
        implicit none
        class(DataLogger), intent(inout) :: self

        write(*,*) 'do_something'
    end subroutine
end module

在 'minimalisticcase.f03' 的第 40 行,我们调用 DataLogger 的 'do_something'。但是执行的是 DataStructure 的 'beginning_of_alphabet' 子例程!

显然可以通过将 'minimalisticcase.f03' 中的第 13 行从 type(DataStructure), pointer :: data_structure 更改为 class(DataStructure), pointer :: data_structure.

来解决这个问题

但是为什么呢?

这是 gfortran 中的错误。我将它作为 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82312 发布在 Bugzilla 上。该错误现已在 GCC 主干上修复。

临时解决方法是将指针赋值封装在 select 类型中,因此:

    select type (data_structure)
      type is (DataStructure)
        self%data_structure => data_structure
    end select