Actions
Bug #13817
closedtest/unit breaks Hash
Description
Consider the following program:
#!/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:
- The warning occurs, even though
method_defined?
tells us that no<<
method is inHash
. - The warning disappears, when we do not require test/unit, which suggests that the problem is caused by test/unit
- Changing the offending line to
alias :<< :merge!
does not make any difference
Updated by kou (Kouhei Sutou) over 7 years ago
- Status changed from Open to Third Party's Issue
- Assignee set to ktsj (Kazuki Tsujimoto)
It's not caused by test-unit. It's caused by power_assert.
Please report it to https://github.com/k-tsj/power_assert/issues/new with the following script:
#!/usr/bin/env ruby
$VERBOSE = true
require 'power_assert/enable_tracepoint_events'
class Hash
STDERR.puts method_defined?(:<<)
alias << merge!
STDERR.puts method_defined?(:<<)
end
Updated by rovf (Ronald Fischer) over 7 years ago
Bug reported at https://github.com/k-tsj/power_assert/issues/19
Updated by wanabe (_ wanabe) over 7 years ago
- Related to Bug #11182: Refinement with alias causes strange behavior added
Updated by nobu (Nobuyoshi Nakada) over 7 years ago
- Description updated (diff)
- 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.
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
Updated by nobu (Nobuyoshi Nakada) over 7 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r59613.
vm_method.c: alias warning at refined method
- vm_method.c (rb_method_entry_make): suppress a warning at
refined method which will not be redefined.
[ruby-core:82385] [Bug #13817]
Updated by nagachika (Tomoyuki Chikanaga) over 7 years ago
- Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE
ruby_2_4 r59819 merged revision(s) 59613.
Updated by usa (Usaku NAKAMURA) over 7 years ago
- Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE
ruby_2_3 r59880 merged revision(s) 59613.
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0