Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions flang/lib/Semantics/expression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1215,15 +1215,16 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::Substring &ss) {
if (!ubValue) {
ubValue = len;
}
if (lbValue && ubValue && *lbValue > *ubValue) {
if ((len && *len == 0) ||
(lbValue && ubValue && *lbValue > *ubValue)) {
// valid, substring is empty
} else if (lbValue && *lbValue < 1 && (ubValue || !last)) {
Say("Substring must begin at 1 or later, not %jd"_err_en_US,
static_cast<std::intmax_t>(*lbValue));
return std::nullopt;
} else if (ubValue && len && *ubValue > *len &&
(lbValue || !first)) {
Say("Substring must end at %zd or earlier, not %jd"_err_en_US,
Say("Substring must end at %jd or earlier, not %jd"_err_en_US,
static_cast<std::intmax_t>(*len),
static_cast<std::intmax_t>(*ubValue));
return std::nullopt;
Expand Down
37 changes: 37 additions & 0 deletions flang/test/Semantics/zero_len_char_array.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
! CHECK-NOT: error:
! Test that zero-length character substrings with lbound>ubounds indices
! do not produce spurious errors when the character array is zero length.
program flang_t7052
implicit none
character*(*), parameter :: param_char = ""
character*(0) :: zero_len_char

if ( param_char(init(5):init(3)) > zero_len_char(1:-2) ) then
print *,"Test failed"
endif

if ( param_char(init(5):init(3)) > zero_len_char(10:2) ) then
print *,"Test failed"
endif

if ( param_char(init(5):init(3)) > zero_len_char(init(10):2) ) then
print *,"Test failed"
endif

if ( param_char(init(5):init(3)) > zero_len_char(init(10):-2) ) then
print *,"Test failed"
endif

if ( param_char(init(5):init(3)) > zero_len_char(2:init(10)) ) then
print *,"Test failed"
endif

contains

integer function init(i)
integer, intent(in) :: i
init=i
end

end program