From: merch-redmine@... Date: 2021-05-12T22:08:14+00:00 Subject: [ruby-core:103808] [Ruby master Bug#17857] `when 0r` and `when 0i` do not match with `case 0` Issue #17857 has been updated by jeremyevans0 (Jeremy Evans). I've submitted a pull request to fix this: https://github.com/ruby/ruby/pull/4496 ---------------------------------------- Bug #17857: `when 0r` and `when 0i` do not match with `case 0` https://bugs.ruby-lang.org/issues/17857#change-91923 * Author: mame (Yusuke Endoh) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- 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 `:bar`. However, I believe it should print `:foo` because `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 `:foo`. ``` opt = RubyVM::InstructionSequence.compile_option opt[:specialized_instruction] = false RubyVM::InstructionSequence.compile(< :foo else p :bar end END ``` I think the optimization should be disabled when T_RATIONAL or T_COMPLEX are used. -- https://bugs.ruby-lang.org/ Unsubscribe: