diff options
author | Jeremy Evans <code@jeremyevans.net> | 2021-05-12 15:06:12 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2021-05-12 19:30:05 -0700 |
commit | 9ce29c94d82c6bf278b1be088435726a9c47e225 (patch) | |
tree | 56bc4e69a023a2576a12b72a097dd9b50b057e0a | |
parent | 11ae581a4a7f5d5f5ec6378872eab8f25381b1b9 (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.c | 3 | ||||
-rw-r--r-- | test/ruby/test_case.rb | 12 |
2 files changed, 15 insertions, 0 deletions
@@ -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 |