Hello all,

During some testing with IPv6 stuff, I've found a bug in the handling  
of object given to Fixnum#& that is coerced into a Bignum. The  
following code shows the problem:

class BignumMock
   def to_int
     2 ** 64
   end
end

mock = BignumMock.new

puts 3 & 2 ** 64
puts 3 & mock.to_int
puts 3 & mock


The last line fails, but what I would expect is that it the object is  
coerced correctly. The cause of this is that in fix_and in numeric.c,  
only a direct Bignum is checked. If y in fix_and is not a Fixnum or  
Bignum, it should be coerced first and then the result should be  
checked for the Bignum type. This would easily fix this bug.

The same problem also applies to fix_or and fix_xor of course.

-- 
Regards,

Dirkjan Bussink