Bug #10711
closedIncorrect error message in coerce failed
Description
$ ruby -v -e '1 & 1.2'
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
-e:1: warning: possibly useless use of & in void context
-e:1:in `&': 1.2 can't be coerced into Float (TypeError)
from -e:1:in `<main>'
It's telling me it couldn't coerce a Float into a Float, when it probably means into an Integer (or maybe Fixnum?).
I looked at the C, but couldn't see where the problem is. coerce_failed seems to use the correct value to get the class for the error so must be something before there.
Updated by normalperson (Eric Wong) over 9 years ago
do_coerce modifies x, so stashing the original before seems to fix
the problem. Maybe I missed something else. Lightly-tested patch:
--- a/numeric.c
+++ b/numeric.c
@@ -3426,10 +3426,11 @@ static int
bit_coerce(VALUE *x, VALUE *y)
{
if (!FIXNUM_P(*y) && !RB_TYPE_P(*y, T_BIGNUM)) {
- VALUE orig = *x;
do_coerce(x, y, TRUE);
if (!FIXNUM_P(*x) && !RB_TYPE_P(*x, T_BIGNUM)
&& !FIXNUM_P(*y) && !RB_TYPE_P(*y, T_BIGNUM)) {
-
coerce_failed(*x, *y);
-
}coerce_failed(orig, *y);
}
return TRUE;
Updated by Anonymous over 9 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r49224.
numeric.c: correct error message when coerce fails
- numeric.c (bit_coerce): use original value for error message
[ruby-core:67405] [Bug #10711] - test/ruby/test_numeric.rb (test_coerce): check error message
Updated by usa (Usaku NAKAMURA) over 9 years ago
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
memo: see also [ruby-core:67555], [ruby-core:67557], r49234 and r49235.
Updated by naruse (Yui NARUSE) over 9 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: DONE
ruby_2_2 r49313 merged revision(s) 49224,49234,49235.
Updated by usa (Usaku NAKAMURA) over 9 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: DONE to 2.0.0: DONE, 2.1: REQUIRED, 2.2: DONE
ruby_2_0_0 r49443 merged revision(s) 49224,49225,49234,49235.
Updated by usa (Usaku NAKAMURA) about 9 years ago
- Backport changed from 2.0.0: DONE, 2.1: REQUIRED, 2.2: DONE to 2.0.0: DONE, 2.1: DONE, 2.2: DONE
ruby_2_1 r51067 merged revision(s) 49224,49225,49234,49235.