Auto merge of #80962 - jhpratt:const_int_fn-stabilization, r=dtolnay
Stabilize remaining integer methods as `const fn` This pull request stabilizes the following methods as `const fn`: - `i*::checked_div` - `i*::checked_div_euclid` - `i*::checked_rem` - `i*::checked_rem_euclid` - `i*::div_euclid` - `i*::overflowing_div` - `i*::overflowing_div_euclid` - `i*::overflowing_rem` - `i*::overflowing_rem_euclid` - `i*::rem_euclid` - `i*::wrapping_div` - `i*::wrapping_div_euclid` - `i*::wrapping_rem` - `i*::wrapping_rem_euclid` - `u*::checked_div` - `u*::checked_div_euclid` - `u*::checked_rem` - `u*::checked_rem_euclid` - `u*::div_euclid` - `u*::overflowing_div` - `u*::overflowing_div_euclid` - `u*::overflowing_rem` - `u*::overflowing_rem_euclid` - `u*::rem_euclid` - `u*::wrapping_div` - `u*::wrapping_div_euclid` - `u*::wrapping_rem` - `u*::wrapping_rem_euclid` These can all be implemented on the current stable (1.49). There are two unstable details: const likely/unlikely and unchecked division/remainder. Both of these are for optimizations, and are in no way required to make the methods function; there is no exposure of these details publicly. Per comments below, it seems best practice is to stabilize the intrinsics. As such, `intrinsics::unchecked_div` and `intrinsics::unchecked_rem` have been stabilized as `const` as part of this pull request as well. The methods themselves remain unstable. I believe part of the reason these were not stabilized previously was the behavior around division by 0 and modulo 0. After testing on nightly, the diagnostic for something like `const _: i8 = 5i8 % 0i8;` is similar to that of `const _: i8 = 5i8.rem_euclid(0i8);` (assuming the appropriate feature flag is enabled). As such, I believe these methods are ready to be stabilized as `const fn`. This pull request represents the final methods mentioned in #53718. As such, this PR closes #53718. `@rustbot` modify labels to +A-const-fn, +T-libs
This commit is contained in:
commit
4940dd483a
5 changed files with 30 additions and 38 deletions
|
@ -513,7 +513,7 @@ macro_rules! int_impl {
|
|||
#[doc = concat!("assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);")]
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_checked_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -539,7 +539,7 @@ macro_rules! int_impl {
|
|||
#[doc = concat!("assert_eq!((1", stringify!($SelfT), ").checked_div_euclid(0), None);")]
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -565,7 +565,7 @@ macro_rules! int_impl {
|
|||
#[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);")]
|
||||
/// ```
|
||||
#[stable(feature = "wrapping", since = "1.7.0")]
|
||||
#[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_checked_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -591,7 +591,7 @@ macro_rules! int_impl {
|
|||
#[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.checked_rem_euclid(-1), None);")]
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -949,7 +949,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-128i8).wrapping_div(-1), -128);
|
||||
/// ```
|
||||
#[stable(feature = "num_wrapping", since = "1.2.0")]
|
||||
#[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -977,7 +977,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-128i8).wrapping_div_euclid(-1), -128);
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -1005,7 +1005,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-128i8).wrapping_rem(-1), 0);
|
||||
/// ```
|
||||
#[stable(feature = "num_wrapping", since = "1.2.0")]
|
||||
#[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -1032,7 +1032,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-128i8).wrapping_rem_euclid(-1), 0);
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -1299,7 +1299,7 @@ macro_rules! int_impl {
|
|||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "wrapping", since = "1.7.0")]
|
||||
#[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
pub const fn overflowing_div(self, rhs: Self) -> (Self, bool) {
|
||||
|
@ -1329,7 +1329,7 @@ macro_rules! int_impl {
|
|||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
pub const fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
|
||||
|
@ -1360,7 +1360,7 @@ macro_rules! int_impl {
|
|||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "wrapping", since = "1.7.0")]
|
||||
#[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
pub const fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
|
||||
|
@ -1390,7 +1390,7 @@ macro_rules! int_impl {
|
|||
#[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem_euclid(-1), (0, true));")]
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -1615,7 +1615,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
@ -1653,7 +1653,7 @@ macro_rules! int_impl {
|
|||
/// assert_eq!((-a).rem_euclid(-b), 1);
|
||||
/// ```
|
||||
#[stable(feature = "euclidean_division", since = "1.38.0")]
|
||||
#[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")]
|
||||
#[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.51.0")]
|
||||
#[must_use = "this returns the result of the operation, \
|
||||
without modifying the original"]
|
||||
#[inline]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue