core: Fix undefined wrapping behavior triggered by Rust nightly (fix #579) #582
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Casting floats-to-int could be treacherous in Rust, and it is currently undefined behavior on stable if the value wasn't representable in the target type. A PR just landed in nightly that defines these to saturate. This broke a few things in our code that were incorrectly relying on this undefined behavior.
Fix these methods to avoid undefined behavior and properly handle the edge cases. Fixes #579.
See:
https://doc.rust-lang.org/1.22.1/book/first-edition/casting-between-types.html#numeric-casts (old behavior)
rust-lang/rust#71269
rust-lang/rust#10184