Change:
It would be great to have and functions for signed integer types. The current work-around is using a pattern like but having explicit functions would lift the corner-case knowledge "burden" from the user.
What do you expect them to return? Just for the two values that can't be expressed? IMHO you should prefer the instead and explicitly handle that.
The and functions both have a corner case when the negative minimum value is used (e.g. -128 for type i8). The result cannot be represented within the bounds of the output type. The / variants shall return a best-effort value (like 127 in case of -128 i8 input), similar to the existing functions. asserteq!(127i8.saturatingabs(), 127); asserteq!(-127i8.saturatingabs(), 127); asserteq!(-128i8.saturatingabs(), 127); asserteq!(127i8.saturatingneg(), -127); asserteq!(-127i8.saturatingneg(), 127); asserteq!(-128i8.saturating_neg(), 127);
These seems reasonable. I'd suggest just making a PR with them unstable and seeing what libs says. By using they'll automatically get the new saturating implementation, too, which should be better for optimization and codegen than the approach.
Haven't done a PR for Rust yet so will take a look at the contribution guidelines and try to get along.
What's holding up stabilization on this? It seems relatively simple.
In my opinion there is nothing specific holding this up from being stabilized. Initially I wanted to give it some time for others to comment, then forgot about. Added a PR for stabilization now.

Discussion:
Basic usage: ``` <del> ", $Feature, "#![feature(saturating_neg)] assert_eq!(100", stringify!($SelfT), ".saturating_neg(), -100); </del> <ins> ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_neg(), -100); </ins> assert_eq!((-100", stringify!($SelfT), ").saturating_neg(), 100); assert_eq!(", stringify!($SelfT), "::MIN.saturating_neg(), ", stringify!($SelfT), "::MAX);

$EndFeature, " ```"), <del> #[unstable(feature = "saturating_neg", issue = "59983")] </del> <ins> #[stable(feature = "saturating_neg", since = "1.45.0")] </ins> #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[inline] pub const fn saturating_neg(self) -> Self {

Basic usage: ``` <del> ", $Feature, "#![feature(saturating_neg)] assert_eq!(100", stringify!($SelfT), ".saturating_abs(), 100); </del> <ins> ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_abs(), 100); </ins> assert_eq!((-100", stringify!($SelfT), ").saturating_abs(), 100); assert_eq!(", stringify!($SelfT), "::MIN.saturating_abs(), ", stringify!($SelfT), "::MAX);

$EndFeature, " ```"), <del> #[unstable(feature = "saturating_neg", issue = "59983")] </del> <ins> #[stable(feature = "saturating_neg", since = "1.45.0")] </ins> #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[inline] pub const fn saturating_abs(self) -> Self {

#![feature(pattern)] #![feature(range_is_empty)] #![feature(raw)] <del> #![feature(saturating_neg)] </del> #![feature(sort_internals)] #![feature(slice_partition_at_index)] #![feature(specialization)]

// run-pass <del> #![feature(saturating_neg)] </del> #![feature(const_checked_int_methods)] #![feature(const_euclidean_int_methods)] #![feature(const_overflowing_int_methods)]