LOC 和 %LOC 在 Windows 的子例程中不起作用

LOC and %LOC not working in subroutines on Windows

我有一个 Fortran 90 项目,它广泛使用 loc 函数来获取数组的地址(API 的一部分,用于与 Matlab 的互操作性)。

此代码在 Mac 和 Linux 上编译并适用于 Intel 和 gfortran,并且已经有一段时间了(跨几个不同的编译器版本)。

我现在正在尝试使用来自 Composer XE 2015 的 Intel Fortran Windows 进行构建。当我逐步使用调试器时,我看到我的主函数中的 LOC 调用正确 returns 地址,但从中调用的子例程中的调用似乎什么都不做 - 它只是 returns 数据的值而不是位置。

有谁知道为什么 LOC 不起作用?我尝试同时使用 loc() 和 %LOC() 并获得相同的行为。有关示例,请参见 this function。第 69 行的 loc 有效,第 116 行的 loc 无效(只是 returns 数据的值)。 REPIDX_0(X,1) 是一个预处理器宏,在这种情况下只是 returns X.

任何建议或指示将不胜感激 - 我完全被困住了。

这是一个最小的例子:

program testloc
  implicit none
  real, pointer :: x
  integer(8) :: add1, add2

  allocate(x)
  x = 2
  add1 = loc(x)
  call get_add(x,add2)
  write(*,*) add1
  write(*,*) add2
  deallocate(x)
contains
  subroutine get_add(x,add)
      real, pointer, intent(in) :: x
      integer(8), intent(out) :: add
      add = loc(x)
  end subroutine
end program

在 Mac/Linux 上使用 ifort 12.1.3 我得到了预期的输出:

MatlabAPI_lite robince$ ./a.out
       140661969926608
       140661969926608

在 Windows 上使用 ifort 15.0.1 我得到有问题的输出:

c:\code\MatlabAPI_lite>testloc
         4636400
               2

这是一个编译器错误 - 它已在 15.0.3 中修复。