diff --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp --- a/flang/lib/Evaluate/fold-integer.cpp +++ b/flang/lib/Evaluate/fold-integer.cpp @@ -89,7 +89,17 @@ } } if (IsActuallyConstant(*array)) { - return Expr{GetConstantArrayLboundHelper{*dim}.GetLbound(*array)}; + if (dim) { + return Expr{GetConstantArrayLboundHelper{*dim}.GetLbound(*array)}; + } + // DIM= was not specified - return lbounds for all dimensions + std::vector> const_lbounds(rank); + for (ConstantSubscript d = 0; d < rank; ++d) { + const_lbounds[d] = + Scalar{GetConstantArrayLboundHelper{d}.GetLbound(*array)}; + } + return Expr{ + Constant{std::move(const_lbounds), ConstantSubscripts{rank}}}; } if (lowerBoundsAreOne) { if (dim) { diff --git a/flang/test/Evaluate/folding08.f90 b/flang/test/Evaluate/folding08.f90 --- a/flang/test/Evaluate/folding08.f90 +++ b/flang/test/Evaluate/folding08.f90 @@ -77,4 +77,22 @@ end block end associate end subroutine + subroutine test3_lbound_parameter + ! Test lbound with constant arrays + integer, parameter :: a1(1) = 0 + integer, parameter :: lba1(*) = lbound(a1) + logical, parameter :: test_lba1 = all(lba1 == [1]) + + integer, parameter :: a2(0:1) = 0 + integer, parameter :: lba2(*) = lbound(a2) + logical, parameter :: test_lba2 = all(lba2 == [0]) + + integer, parameter :: a3(2:4,4:6) = 0 + integer, parameter :: lba3(*) = lbound(a3) + logical, parameter :: test_lba3 = all(lba3 == [2, 4]) + + integer, parameter :: a4(2:4,1,4:6) = 0 + integer, parameter :: lba4(*) = lbound(a4) + logical, parameter :: test_lba4 = all(lba4 == [2, 1, 4]) + end subroutine end