Skip to content

Commit e1f7382

Browse files
committed
Implement intrinsics with fallback bodies
1 parent 4d0a8a6 commit e1f7382

File tree

1 file changed

+69
-69
lines changed

1 file changed

+69
-69
lines changed

core/src/intrinsics.rs

Lines changed: 69 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2517,79 +2517,79 @@ extern "rust-intrinsic" {
25172517
where
25182518
G: FnOnce<ARG, Output = RET>,
25192519
F: FnOnce<ARG, Output = RET>;
2520+
}
25202521

2521-
/// Returns whether the argument's value is statically known at
2522-
/// compile-time.
2523-
///
2524-
/// This is useful when there is a way of writing the code that will
2525-
/// be *faster* when some variables have known values, but *slower*
2526-
/// in the general case: an `if is_val_statically_known(var)` can be used
2527-
/// to select between these two variants. The `if` will be optimized away
2528-
/// and only the desired branch remains.
2529-
///
2530-
/// Formally speaking, this function non-deterministically returns `true`
2531-
/// or `false`, and the caller has to ensure sound behavior for both cases.
2532-
/// In other words, the following code has *Undefined Behavior*:
2533-
///
2534-
/// ```no_run
2535-
/// #![feature(is_val_statically_known)]
2536-
/// #![feature(core_intrinsics)]
2537-
/// # #![allow(internal_features)]
2538-
/// use std::hint::unreachable_unchecked;
2539-
/// use std::intrinsics::is_val_statically_known;
2540-
///
2541-
/// unsafe {
2542-
/// if !is_val_statically_known(0) { unreachable_unchecked(); }
2543-
/// }
2544-
/// ```
2545-
///
2546-
/// This also means that the following code's behavior is unspecified; it
2547-
/// may panic, or it may not:
2548-
///
2549-
/// ```no_run
2550-
/// #![feature(is_val_statically_known)]
2551-
/// #![feature(core_intrinsics)]
2552-
/// # #![allow(internal_features)]
2553-
/// use std::intrinsics::is_val_statically_known;
2554-
///
2555-
/// unsafe {
2556-
/// assert_eq!(is_val_statically_known(0), is_val_statically_known(0));
2557-
/// }
2558-
/// ```
2559-
///
2560-
/// Unsafe code may not rely on `is_val_statically_known` returning any
2561-
/// particular value, ever. However, the compiler will generally make it
2562-
/// return `true` only if the value of the argument is actually known.
2563-
///
2564-
/// When calling this in a `const fn`, both paths must be semantically
2565-
/// equivalent, that is, the result of the `true` branch and the `false`
2566-
/// branch must return the same value and have the same side-effects *no
2567-
/// matter what*.
2568-
#[rustc_const_unstable(feature = "is_val_statically_known", issue = "none")]
2569-
#[rustc_nounwind]
2570-
pub fn is_val_statically_known<T: Copy>(arg: T) -> bool;
2571-
2572-
/// Returns the value of `cfg!(debug_assertions)`, but after monomorphization instead of in
2573-
/// macro expansion.
2574-
///
2575-
/// This always returns `false` in const eval and Miri. The interpreter provides better
2576-
/// diagnostics than the checks that this is used to implement. However, this means
2577-
/// you should only be using this intrinsic to guard requirements that, if violated,
2578-
/// immediately lead to UB. Otherwise, const-eval and Miri will miss out on those
2579-
/// checks entirely.
2580-
///
2581-
/// Since this is evaluated after monomorphization, branching on this value can be used to
2582-
/// implement debug assertions that are included in the precompiled standard library, but can
2583-
/// be optimized out by builds that monomorphize the standard library code with debug
2584-
/// assertions disabled. This intrinsic is primarily used by [`assert_unsafe_precondition`].
2585-
#[rustc_const_unstable(feature = "delayed_debug_assertions", issue = "none")]
2586-
#[rustc_safe_intrinsic]
2587-
#[cfg(not(bootstrap))]
2588-
pub(crate) fn debug_assertions() -> bool;
2522+
/// Returns whether the argument's value is statically known at
2523+
/// compile-time.
2524+
///
2525+
/// This is useful when there is a way of writing the code that will
2526+
/// be *faster* when some variables have known values, but *slower*
2527+
/// in the general case: an `if is_val_statically_known(var)` can be used
2528+
/// to select between these two variants. The `if` will be optimized away
2529+
/// and only the desired branch remains.
2530+
///
2531+
/// Formally speaking, this function non-deterministically returns `true`
2532+
/// or `false`, and the caller has to ensure sound behavior for both cases.
2533+
/// In other words, the following code has *Undefined Behavior*:
2534+
///
2535+
/// ```no_run
2536+
/// #![feature(is_val_statically_known)]
2537+
/// #![feature(core_intrinsics)]
2538+
/// # #![allow(internal_features)]
2539+
/// use std::hint::unreachable_unchecked;
2540+
/// use std::intrinsics::is_val_statically_known;
2541+
///
2542+
/// unsafe {
2543+
/// if !is_val_statically_known(0) { unreachable_unchecked(); }
2544+
/// }
2545+
/// ```
2546+
///
2547+
/// This also means that the following code's behavior is unspecified; it
2548+
/// may panic, or it may not:
2549+
///
2550+
/// ```no_run
2551+
/// #![feature(is_val_statically_known)]
2552+
/// #![feature(core_intrinsics)]
2553+
/// # #![allow(internal_features)]
2554+
/// use std::intrinsics::is_val_statically_known;
2555+
///
2556+
/// unsafe {
2557+
/// assert_eq!(is_val_statically_known(0), is_val_statically_known(0));
2558+
/// }
2559+
/// ```
2560+
///
2561+
/// Unsafe code may not rely on `is_val_statically_known` returning any
2562+
/// particular value, ever. However, the compiler will generally make it
2563+
/// return `true` only if the value of the argument is actually known.
2564+
///
2565+
/// When calling this in a `const fn`, both paths must be semantically
2566+
/// equivalent, that is, the result of the `true` branch and the `false`
2567+
/// branch must return the same value and have the same side-effects *no
2568+
/// matter what*.
2569+
#[rustc_const_unstable(feature = "is_val_statically_known", issue = "none")]
2570+
#[rustc_nounwind]
2571+
#[unstable(feature = "core_intrinsics", issue = "none")]
2572+
#[cfg_attr(not(bootstrap), rustc_intrinsic)]
2573+
pub const unsafe fn is_val_statically_known<T: Copy>(_arg: T) -> bool {
2574+
false
25892575
}
25902576

2591-
#[cfg(bootstrap)]
2577+
/// Returns the value of `cfg!(debug_assertions)`, but after monomorphization instead of in
2578+
/// macro expansion.
2579+
///
2580+
/// This always returns `false` in const eval and Miri. The interpreter provides better
2581+
/// diagnostics than the checks that this is used to implement. However, this means
2582+
/// you should only be using this intrinsic to guard requirements that, if violated,
2583+
/// immediately lead to UB. Otherwise, const-eval and Miri will miss out on those
2584+
/// checks entirely.
2585+
///
2586+
/// Since this is evaluated after monomorphization, branching on this value can be used to
2587+
/// implement debug assertions that are included in the precompiled standard library, but can
2588+
/// be optimized out by builds that monomorphize the standard library code with debug
2589+
/// assertions disabled. This intrinsic is primarily used by [`assert_unsafe_precondition`].
25922590
#[rustc_const_unstable(feature = "delayed_debug_assertions", issue = "none")]
2591+
#[unstable(feature = "core_intrinsics", issue = "none")]
2592+
#[cfg_attr(not(bootstrap), rustc_intrinsic)]
25932593
pub(crate) const fn debug_assertions() -> bool {
25942594
cfg!(debug_assertions)
25952595
}

0 commit comments

Comments
 (0)