`when 0r` and `when 0i` do not match with `case 0`
The following code prints
:bar between Ruby 2.1 .. 2.5, and dumps core since Ruby 2.6.
case 0 when 0r p :foo else p :bar #=> :bar end
A Complex has the same issue.
case 0 when 0i p :foo else p :bar #=> :bar end
The segfault issue was fixed by #17854. So the current master it prints
However, I believe it should print
0r === 0 evaluates to true. This weird behavior is caused by the optimization which uses a hidden hash to dispatch to when clauses. By disabling the optimization, the code prints
opt = RubyVM::InstructionSequence.compile_option opt[:specialized_instruction] = false RubyVM::InstructionSequence.compile(<<END, **opt).eval case 0 when 0r p :foo #=> :foo else p :bar end END
I think the optimization should be disabled when T_RATIONAL or T_COMPLEX are used.