summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2021-05-12 15:06:12 -0700
committerJeremy Evans <code@jeremyevans.net>2021-05-12 19:30:05 -0700
commit9ce29c94d82c6bf278b1be088435726a9c47e225 (patch)
tree56bc4e69a023a2576a12b72a097dd9b50b057e0a
parent11ae581a4a7f5d5f5ec6378872eab8f25381b1b9 (diff)
Avoid improper optimization of case statements mixed integer/rational/complex
Fixes [Bug #17857]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4496
-rw-r--r--compile.c3
-rw-r--r--test/ruby/test_case.rb12
2 files changed, 15 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 2e10659afa..a9c2f96781 100644
--- a/compile.c
+++ b/compile.c
@@ -4537,6 +4537,9 @@ rb_node_case_when_optimizable_literal(const NODE *const node)
modf(RFLOAT_VALUE(v), &ival) == 0.0) {
return FIXABLE(ival) ? LONG2FIX((long)ival) : rb_dbl2big(ival);
}
+ if (RB_TYPE_P(v, T_RATIONAL) || RB_TYPE_P(v, T_COMPLEX)) {
+ return Qundef;
+ }
if (SYMBOL_P(v) || rb_obj_is_kind_of(v, rb_cNumeric)) {
return v;
}
diff --git a/test/ruby/test_case.rb b/test/ruby/test_case.rb
index 77612a8945..4a0f1bf78d 100644
--- a/test/ruby/test_case.rb
+++ b/test/ruby/test_case.rb
@@ -102,6 +102,18 @@ class TestCase < Test::Unit::TestCase
else
assert(false)
end
+ case 0
+ when 0r
+ assert(true)
+ else
+ assert(false)
+ end
+ case 0
+ when 0i
+ assert(true)
+ else
+ assert(false)
+ end
end
def test_method_missing