diff --git a/flang/include/flang/Evaluate/integer.h b/flang/include/flang/Evaluate/integer.h --- a/flang/include/flang/Evaluate/integer.h +++ b/flang/include/flang/Evaluate/integer.h @@ -176,22 +176,22 @@ constexpr Integer &operator=(const Integer &) = default; constexpr bool operator<(const Integer &that) const { - return CompareUnsigned(that) == Ordering::Less; + return CompareSigned(that) == Ordering::Less; } constexpr bool operator<=(const Integer &that) const { - return CompareUnsigned(that) != Ordering::Greater; + return CompareSigned(that) != Ordering::Greater; } constexpr bool operator==(const Integer &that) const { - return CompareUnsigned(that) == Ordering::Equal; + return CompareSigned(that) == Ordering::Equal; } constexpr bool operator!=(const Integer &that) const { return !(*this == that); } constexpr bool operator>=(const Integer &that) const { - return CompareUnsigned(that) != Ordering::Less; + return CompareSigned(that) != Ordering::Less; } constexpr bool operator>(const Integer &that) const { - return CompareUnsigned(that) == Ordering::Greater; + return CompareSigned(that) == Ordering::Greater; } // Left-justified mask (e.g., MASKL(1) has only its sign bit set) diff --git a/flang/test/Semantics/case01.f90 b/flang/test/Semantics/case01.f90 --- a/flang/test/Semantics/case01.f90 +++ b/flang/test/Semantics/case01.f90 @@ -163,3 +163,17 @@ end select end program + +program test_overlap + integer :: i + !OK: these cases do not overlap + select case(i) + case(0:) + case(:-1) + end select + select case(i) + case(-1:) + !ERROR: CASE (:0_4) conflicts with previous cases + case(:0) + end select +end