Issue #10711 has been updated by Eric Wong.


 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;

----------------------------------------
Bug #10711: Incorrect error message in coerce failed
https://bugs.ruby-lang.org/issues/10711#change-50842

* Author: Chris Seaton
* Status: Open
* Priority: Low
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
~~~
$ 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.



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