diff --git a/error.c b/error.c index 9da51a3a39..5dd6b2b765 100644 --- a/error.c +++ b/error.c @@ -1965,8 +1965,10 @@ name_err_mesg_to_str(VALUE obj) d = rb_protect(name_err_mesg_receiver_name, obj, &state); if (state || d == Qundef || d == Qnil) d = rb_protect(rb_inspect, obj, &state); - if (state) + if (state) { rb_set_errinfo(Qnil); + } + d = rb_check_string_type(d); if (NIL_P(d)) { d = rb_any_to_s(obj); } diff --git a/test/ruby/test_nomethod_error.rb b/test/ruby/test_nomethod_error.rb index 170a6c6c57..8b81052905 100644 --- a/test/ruby/test_nomethod_error.rb +++ b/test/ruby/test_nomethod_error.rb @@ -90,4 +90,20 @@ class TestNoMethodError < Test::Unit::TestCase str.__send__(id) end end + + def test_to_s + pre = Module.new do + def name + BasicObject.new + end + end + mod = Module.new + mod.singleton_class.prepend(pre) + + err = assert_raise(NoMethodError) do + mod.this_method_does_not_exist + end + + assert_match(/undefined method.+this_method_does_not_exist.+for.+Module/, err.to_s) + end end