This is a bug that affects all flang-based compilers: NVIDIA nvfortran 22.3 (tested on Ubuntu 20.04), classic flang 7.0.1, Huawei Bisheng flang 1.3.3, and AOCC 3.2.0 flang. They raise a false positive error of out-bound subscripts when invoked with the -Mbounds
flag.
Here is a minimal working example. The latest version of the code is available at my GitHub repo dedicated to testing Fortran compilers.
! test_solve.f90
module solve_mod
implicit none
private
public :: solve
contains
function solve(A, b) result(x) ! A naive solver for upper-triangle linear systems
implicit none
real, intent(in) :: A(:, :), b(:)
real :: x(size(A, 2))
integer :: i, n
n = size(b)
do i = n, 1, -1
x(i) = (b(i) - inprod(A(i, i + 1:n), x(i + 1:n))) / A(i, i)
!x(i) = (b(i) - dot_product(A(i, i + 1:n), x(i + 1:n))) / A(i, i) ! No problem will arise
end do
end function solve
function inprod(x, y) result(z)
real, intent(in) :: x(:), y(:)
real :: z
z = dot_product(x, y)
end function inprod
end module solve_mod
program test_solve
use, non_intrinsic :: solve_mod, only : solve
implicit none
real :: A(1, 1), b(1)
A = 1.0
b = 1.0
write (*, *) solve(A, b)
end program test_solve
The error message looks like the following.
$ nvfortran -Mbounds test_solve.f90 && ./a.out
0: Subscript out of range for array x (test_solve.f90: 19)
subscript=2, lower bound=1, upper bound=1, dimension=1
Thank you for having a look at it.