From: nobu@... Date: 2017-08-17T14:24:35+00:00 Subject: [ruby-core:82416] [Ruby trunk Bug#13817][Open] test/unit breaks Hash Issue #13817 has been updated by nobu (Nobuyoshi Nakada). Description updated Status changed from Third Party's Issue to Open Backport changed from 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED It's a ruby's bug. "old <<" means a refined method, but it is not redefined actually. ```ruby class C def t; :t; end def f; :f; end end module M refine C do alias foo t end end class C alias foo f end using M p C.new.foo #=> :t ``` ---------------------------------------- Bug #13817: test/unit breaks Hash https://bugs.ruby-lang.org/issues/13817#change-66215 * Author: rovf (Ronald Fischer) * Status: Open * Priority: Normal * Assignee: ktsj (Kazuki Tsujimoto) * Target version: * ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] * Backport: 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED ---------------------------------------- Consider the following program: ~~~ruby #!/usr/bin/env ruby BEGIN {$VERBOSE = true} require 'test/unit' class Hash STDERR.puts method_defined?(:<<) alias << merge! STDERR.puts method_defined?(:<<) end ~~~ In older Ruby versions (1.9.3, 2.3.3), the output of this program was: ``` false true ``` In Ruby 2.4.1, the output is ``` false ~/work/stash/vp5/src/test/test_xx.rb:6: warning: method redefined; discarding old << true ``` Please note: 1. The warning occurs, even though `method_defined?` tells us that no `<<` method is in `Hash`. 2. The warning disappears, when we do **not** require test/unit, which suggests that the problem is caused by test/unit 3. Changing the offending line to `alias :<< :merge!` does not make any difference -- https://bugs.ruby-lang.org/ Unsubscribe: