summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-02-09 09:58:05 -0800
committerJeremy Evans <code@jeremyevans.net>2022-02-09 19:47:28 -0800
commitfd710d7e9995679db80b7adf35bbda2cd4db90c6 (patch)
treeb4562df20ddfb4d1a1db40e960f0cebc747f36c4
parent05b1944c53205ffd8c11f1ec2ae6fd48485b55b1 (diff)
downloadruby-fd710d7e9995679db80b7adf35bbda2cd4db90c6.tar.gz
Fix Range#include? for beginless exclusive string ranges
Previously, include? would return true for the end of the range, when it should return false because the range is exclusive. Research and Analysis by Victor Shepelev. Fixes [Bug #18577]
-rw-r--r--range.c3
-rw-r--r--test/ruby/test_range.rb4
2 files changed, 7 insertions, 0 deletions
diff --git a/range.c b/range.c
index 2390c5d38c..27f681767f 100644
--- a/range.c
+++ b/range.c
@@ -1792,6 +1792,9 @@ range_include_internal(VALUE range, VALUE val, int string_use_cover)
else if (NIL_P(beg)) {
VALUE r = rb_funcall(val, id_cmp, 1, end);
if (NIL_P(r)) return Qfalse;
+ if (RANGE_EXCL(range)) {
+ return RBOOL(rb_cmpint(r, val, end) < 0);
+ }
return RBOOL(rb_cmpint(r, val, end) <= 0);
}
else if (NIL_P(end)) {
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index 8ac1930be6..8789eca749 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -604,6 +604,10 @@ class TestRange < Test::Unit::TestCase
assert_include(0...10, 5)
assert_include(5..., 10)
assert_not_include(5..., 0)
+ assert_include(.."z", "z")
+ assert_not_include(..."z", "z")
+ assert_include(..10, 10)
+ assert_not_include(...10, 10)
end
def test_cover