Skip to content

Commit

Permalink
Stabilize hint_assert_unchecked
Browse files Browse the repository at this point in the history
Make both `hint_assert_unchecked` and `const_hint_assert_unchecked`
stable as `hint_assert_unchecked`.
  • Loading branch information
tgross35 committed Apr 7, 2024
1 parent f692c4c commit 4f77927
Show file tree
Hide file tree
Showing 7 changed files with 10 additions and 18 deletions.
1 change: 0 additions & 1 deletion library/alloc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@
#![feature(fn_traits)]
#![feature(generic_nonzero)]
#![feature(hasher_prefixfree_extras)]
#![feature(hint_assert_unchecked)]
#![feature(inline_const)]
#![feature(inplace_iteration)]
#![feature(iter_advance_by)]
Expand Down
15 changes: 7 additions & 8 deletions library/core/src/hint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,11 @@ pub const unsafe fn unreachable_unchecked() -> ! {
/// compiler already knows the range of `count_ones`, so there is no benefit to
/// `let n = u32::count_ones(x); assert_unchecked(n <= u32::BITS);`.
///
/// In release mode, the argument will most likely not actually be evaluated.
/// This function produces no code in release mode.
///
/// If ever you are tempted to write `assert_unchecked(false)`, then you are actually looking for
/// [`unreachable_unchecked()`].
/// `assert_unchecked` is logically equivalent to `if !cond { unreachable_unchecked(); }`. If`
/// ever you are tempted to write `assert_unchecked(false)`, you should instead use
/// [`unreachable_unchecked()`] directly.
///
/// # Safety
///
Expand All @@ -147,8 +148,6 @@ pub const unsafe fn unreachable_unchecked() -> ! {
/// # Example
///
/// ```
/// #![feature(hint_assert_unchecked)]
///
/// use core::hint;
///
/// /// # Safety
Expand Down Expand Up @@ -196,11 +195,11 @@ pub const unsafe fn unreachable_unchecked() -> ! {
/// pointer already has the builtin assumption that it is nonnull. However, the optimizer can
/// make use of this information even when it isn't as obvious, such as when checks happen in
/// called functions.
#[track_caller]
#[inline(always)]
#[doc(alias = "assume")]
#[track_caller]
#[unstable(feature = "hint_assert_unchecked", issue = "119131")]
#[rustc_const_unstable(feature = "const_hint_assert_unchecked", issue = "119131")]
#[stable(feature = "hint_assert_unchecked", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_stable(feature = "hint_assert_unchecked", since = "CURRENT_RUSTC_VERSION")]
pub const unsafe fn assert_unchecked(cond: bool) {
// SAFETY: The caller promised `cond` is true.
unsafe {
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/intrinsics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -960,7 +960,7 @@ extern "rust-intrinsic" {
/// not be used if the invariant can be discovered by the optimizer on its
/// own, or if it does not enable any significant optimizations.
///
/// This intrinsic does not have a stable counterpart.
/// The stabilized version of this intrinsic is [`core::hint::assert_unchecked`].
#[rustc_const_stable(feature = "const_assume", since = "1.77.0")]
#[rustc_nounwind]
#[unstable(feature = "core_intrinsics", issue = "none")]
Expand Down
1 change: 0 additions & 1 deletion library/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@
#![feature(const_fmt_arguments_new)]
#![feature(const_hash)]
#![feature(const_heap)]
#![feature(const_hint_assert_unchecked)]
#![feature(const_index_range_slice_index)]
#![feature(const_int_from_str)]
#![feature(const_intrinsic_copy)]
Expand Down
1 change: 0 additions & 1 deletion library/std/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,6 @@
#![feature(generic_nonzero)]
#![feature(hasher_prefixfree_extras)]
#![feature(hashmap_internals)]
#![feature(hint_assert_unchecked)]
#![feature(ip)]
#![feature(maybe_uninit_slice)]
#![feature(maybe_uninit_uninit_array)]
Expand Down
6 changes: 1 addition & 5 deletions tests/ui/consts/const-assert-unchecked-ub.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
#![feature(hint_assert_unchecked)]
#![feature(const_hint_assert_unchecked)]

const _: () = unsafe {
let n = u32::MAX.count_ones();
std::hint::assert_unchecked(n < 32); //~ ERROR evaluation of constant value failed
};

fn main() {
}
fn main() {}
2 changes: 1 addition & 1 deletion tests/ui/consts/const-assert-unchecked-ub.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0080]: evaluation of constant value failed
--> $DIR/const-assert-unchecked-ub.rs:6:5
--> $DIR/const-assert-unchecked-ub.rs:3:5
|
LL | std::hint::assert_unchecked(n < 32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `assume` called with `false`
Expand Down

0 comments on commit 4f77927

Please sign in to comment.