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 @@ -677,7 +677,11 @@ return std::visit( [&](auto &kx) { if (auto len{kx.LEN()}) { - return Fold(context, ConvertToType(*std::move(len))); + if (IsConstantExpr(len)) { + return Fold(context, ConvertToType(*std::move(len))); + } else { + return Expr{std::move(funcRef)}; + } } else { return Expr{std::move(funcRef)}; } diff --git a/flang/test/Evaluate/rewrite01.f90 b/flang/test/Evaluate/rewrite01.f90 --- a/flang/test/Evaluate/rewrite01.f90 +++ b/flang/test/Evaluate/rewrite01.f90 @@ -76,4 +76,33 @@ !CHECK: PRINT *, 1_4 print *, lbound(returns_array_3(), dim=1) end subroutine + +subroutine len_test(a,b, c, d) + character(*) :: a, b + external b + character(10) :: c, d + external d + + !CHECK: PRINT *, len(a) + print *, len(a) + !CHECK: PRINT *, 5_4 + print *, len(a(1:5)) + !CHECK: PRINT *, len(b(a)) + print *, len(b(a)) + !CHECK: PRINT *, len(b(a)//a) + print *, len(b(a) // a) + !CHECK: PRINT *, 10_4 + print *, len(c) + !CHECK: PRINT *, len(c(int(i,kind=8):int(j,kind=8))) + print *, len(c(i:j)) + !CHECK: PRINT *, 5_4 + print *, len(c(1:5)) + !CHECK: PRINT *, 10_4 + print *, len(d(c)) + !CHECK: PRINT *, 20_4 + print *, len(d(c) // c) + !CHECK: PRINT *, 0_4 + print *, len(a(10:4)) +end subroutine len_test + end module