Issue #9089 has been updated by Akira Tanaka.

Status changed from Feedback to Rejected

This issue is not acceptable because it is very inconsistent that only FIX2UINT on 64bit environment rejects negative numbers.
Changing the behavior of other functions, NUM2Uxxx and FIX2Uxxx, is too incompatible.

If people needs rigid conversion functions, it is better to define them as new functions.
Also, rb_integer_pack is usable to convert numbers and detect overflow and sign.

----------------------------------------
Bug #9089: rb_fix2uint no longer raises a RangeError when given negative values
https://bugs.ruby-lang.org/issues/9089#change-46543

* Author: Arthur Schreiber
* Status: Rejected
* Priority: Normal
* Assignee: 
* Category: core
* Target version: current: 2.2.0
* ruby -v: ruby 2.1.0dev (2013-11-07 trunk 43560)
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN
----------------------------------------
Up until the change that was made in ((<URL:https://github.com/ruby/ruby/commit/92f59c6d7937b14bb5eefb052099ef0a3ef3bcd0>)), (({rb_fix2uint})) would raise a (({RangeError})) if it was given a negative value like (({-1})) (e.g. when using the (({FIX2UINT})) macro).

Due to the changes made in that commit, this error is no longer raised and (({rb_fix2uint})) will return an incorrect value instead.

There is a C-API spec in rubyspec that shows that this behavior has changed between 2.0.0-p247 and 2.1.0-preview1, and I checked and made sure this is still not working correctly in the latest 2.1.0-dev version. The failing spec can be found at ((<URL:https://github.com/rubyspec/rubyspec/blob/master/optional/capi/fixnum_spec.rb#L16-L18>)), it is part of the "optional" c-api specs.

Is there any reason why there is the (({if (num < (unsigned long)INT_MIN)})) is made inside the (({check_uint})) function? Doesn't the (({sign})) parameter automatically indicate that we can't convert to an unsigned integer?



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