Issue #8872 has been updated by Tomoyuki Chikanaga.

Status changed from Assigned to Closed

Applied in changeset r44695.

----------
merge revision(s) 43913: [Backport #8872] [Backport #9175]

	* vm_insnhelper.c (check_match): Fix SEGV with VM_CHECKMATCH_TYPE_CASE
	  and class of `pattern` has `method_missing`
	  [Bug #8882] [ruby-core:58606]

----------------------------------------
Backport #8872: Case statements do not honor a refinement of the '===' method
https://bugs.ruby-lang.org/issues/8872#change-44546

* Author: Jon Conley
* Status: Closed
* Priority: Normal
* Assignee: Tomoyuki Chikanaga
* Category: 
* Target version: 
* ruby -v: -
----------------------------------------
=begin
Below, I've redefined the ((|===|)) method of symbol to always return true.  In ((|RefineTest#uses_refinement|)), I call ((|===|)) directly and the refined method is called.  In ((|RefineTest#does_not_use_refinement|)), the ((|===|)) method is called indirectly through a case statement.  If the refined ((|===|)) method was called, the result should be ((*'The refinement was used'*)), but this code currently returns ((*'The refinement was not used'*)).

 module RefineSymbol
   refine Symbol do
     def ===(other)
       true
     end
   end
 end
 
 using RefineSymbol
 
 class RefineTest
   def uses_refinement
     :a === :b
   end
 
   def does_not_use_refinement
     case :a
     when :b
       'The refinement was used'
     else
       'The refinement was not used'
     end
   end
 end
 
 rt = RefineTest.new
 rt.uses_refinement   # => true
 rt.does_not_use_refinement  # => expected 'The refinement was used' but got 'The refinement was not used'
=end




-- 
http://bugs.ruby-lang.org/