长度参数化的传递对象到类型绑定过程有 gfortran 抱怨

Length-parameterized passed object to type-bound procedure has gfortran complain

我正在学习 Fortran,我想将一个数组和一个子例程封装在一个类型中。问题似乎出在自身对象的类型定义中。

这是我想出的最小测试用例:

module testing
  implicit none

  type test(para)
    integer, len :: para
    real, dimension(para) :: weights

  contains
    procedure :: testing => testing_test
  end type
contains
  subroutine testing_test(self)
    class(test(*)) :: self
  end subroutine
end module

使用 gfortran 编译会引发此错误:

module_test.f08:9:23:

  procedure :: testing => testing_test
          1
Error: Argument ‘self’ of ‘testing_test’ with PASS(self) at (1) must be of the derived-type ‘test’

当数组长度固定时有效(因此 type%para 不存在)

我正在尝试做的事情(使用可变大小数组和绑定过程键入)是不可能的,还是我遗漏了有关虚拟参数定义的内容?

感谢@Rodrigo 的想法,我终于找到了这个错误(和补丁): https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82943

要解决此问题,请下载源代码,应用上述补丁并编译您自己的 gfortran。 (或者等到它在存储库中)

A 指向 gfortran 的错误报告和补丁。不过,值得一提的是,这是标准的 Fortran (2003) 代码。

我们这里有一个带有传递对象伪参数的类型绑定过程。这种论证的主要限制是它是:

  • 标量,
  • 不可分配,
  • 非指针对象,
  • 假定所有长度类型参数。

此外,由于类型是可扩展的,因此传递的对象伪参数必须是多态的。

题例,条件都满足

这不是真正的答案,但可能会为某些人提供解决方案。 gfortran-10 还是一样的问题。但是 flang-7 编译了这个例子,它是 available for Ubuntu since 19.10, and maybe other OS:es.