aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--re.c8
-rw-r--r--spec/ruby/core/regexp/match_spec.rb20
-rw-r--r--test/ruby/test_regexp.rb4
3 files changed, 25 insertions, 7 deletions
diff --git a/re.c b/re.c
index e0878baf2c..6b8eda4df8 100644
--- a/re.c
+++ b/re.c
@@ -3323,7 +3323,9 @@ rb_reg_match_m(int argc, VALUE *argv, VALUE re)
pos = 0;
}
- str = SYMBOL_P(str) ? rb_sym2str(str) : StringValue(str);
+ if (NIL_P(str)) {
+ rb_warn("given argument is nil");
+ }
pos = reg_match_pos(re, &str, pos);
if (pos < 0) {
rb_backref_set(Qnil);
@@ -3369,6 +3371,10 @@ rb_reg_match_p(VALUE re, VALUE str, long pos)
const UChar *start, *end;
int tmpreg;
+ if (NIL_P(str)) {
+ rb_warn("given argument is nil");
+ return Qfalse;
+ }
str = SYMBOL_P(str) ? rb_sym2str(str) : StringValue(str);
if (pos) {
if (pos < 0) {
diff --git a/spec/ruby/core/regexp/match_spec.rb b/spec/ruby/core/regexp/match_spec.rb
index c117dcac69..8297be1c1d 100644
--- a/spec/ruby/core/regexp/match_spec.rb
+++ b/spec/ruby/core/regexp/match_spec.rb
@@ -87,7 +87,7 @@ describe "Regexp#match" do
end
end
- ruby_version_is ""..."2.7" do
+ ruby_version_is ""..."3.0" do
it "resets $~ if passed nil" do
# set $~
/./.match("a")
@@ -98,7 +98,13 @@ describe "Regexp#match" do
end
end
- ruby_version_is "2.7" do
+ ruby_version_is "2.7"..."3.0" do
+ it "warns the deprecation when the given argument is nil" do
+ -> { /foo/.match(nil) }.should complain(/given argument is nil/)
+ end
+ end
+
+ ruby_version_is "3.0" do
it "raises TypeError when the given argument is nil" do
-> { /foo/.match(nil) }.should raise_error(TypeError)
end
@@ -137,13 +143,19 @@ describe "Regexp#match?" do
/str/i.match?('string', 1).should be_false
end
- ruby_version_is ""..."2.7" do
+ ruby_version_is ""..."3.0" do
it "returns false when given nil" do
/./.match?(nil).should be_false
end
end
- ruby_version_is "2.7" do
+ ruby_version_is "2.7"..."3.0" do
+ it "warns the deprecation" do
+ -> { /./.match?(nil) }.should complain(/given argument is nil/)
+ end
+ end
+
+ ruby_version_is "3.0" do
it "raises TypeError when given nil" do
-> { /./.match?(nil) }.should raise_error(TypeError)
end
diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb
index 03e94a7464..6cfd7df824 100644
--- a/test/ruby/test_regexp.rb
+++ b/test/ruby/test_regexp.rb
@@ -539,7 +539,7 @@ class TestRegexp < Test::Unit::TestCase
end
def test_match
- assert_raise(TypeError) { //.match(nil) }
+ assert_nil(//.match(nil))
assert_equal("abc", /.../.match(:abc)[0])
assert_raise(TypeError) { /.../.match(Object.new)[0] }
assert_equal("bc", /../.match('abc', 1)[0])
@@ -561,10 +561,10 @@ class TestRegexp < Test::Unit::TestCase
/backref/ =~ 'backref'
# must match here, but not in a separate method, e.g., assert_send,
# to check if $~ is affected or not.
+ assert_equal(false, //.match?(nil))
assert_equal(true, //.match?(""))
assert_equal(true, /.../.match?(:abc))
assert_raise(TypeError) { /.../.match?(Object.new) }
- assert_raise(TypeError) { //.match?(nil) }
assert_equal(true, /b/.match?('abc'))
assert_equal(true, /b/.match?('abc', 1))
assert_equal(true, /../.match?('abc', 1))