记一个gcc7代编译器下allocate-source中有关array bounds的离谱bug

Bug情况

最近写Fortran代码的时候遇到了个怪bug, 代码如下:

然后离谱的来了, 我发现在gcc750和gcc710里面跑出来的shape_data的lbound都是0, 也就是说index是从0开始的, 像C一样了...

但是在gcc11下面就没问题, 是从1开始的

而且下面注释那几行打开的话也没问题, 似乎就是传参进去才会有问题


module m1
  implicit none

contains
  subroutine m1s1(data)
    implicit none
    integer(kind=4),intent(in) :: data(:)

    integer, allocatable :: shape_data(:)

    allocate(shape_data, source=shape(data))
    ! allocate(shape_data(size(shape(data))), source=shape(data))   ! it's ok
    print *, ubound(shape_data), ubound(shape(data))
    print *, lbound(shape_data), lbound(shape(data))

  end subroutine
end module


program main
  use m1
  implicit none
  integer,allocatable :: a(:)


  call m1s1([1,2,3])
  
  !allocate(a, source=shape([4,4,5]))
  !print *, ubound(a)
  !print *, lbound(a)



end program

run一下:

DESKTOP-TKTNVE0:shape_bound$ gfortran --version
GNU Fortran (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

DESKTOP-TKTNVE0:shape_bound$ gfortran main.F90
DESKTOP-TKTNVE0:shape_bound$ ./a.out
           0           1
           0           1

解决思路

  • 要么换个编译器
  • 要么像上面注释行一样, 制定以下shape吧..但是这样用source的意义小了...就是少写一行吧那

总结, 一个字, 离谱!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容