-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Closed
Copy link
Labels
A-contributor-roadblockArea: Makes things more difficult for new or seasoned contributors to RustArea: Makes things more difficult for new or seasoned contributors to RustA-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsF-core_intrinsicsIssue in the "core intrinsics" for internal usage only.Issue in the "core intrinsics" for internal usage only.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
Description
Location
rust/library/core/src/intrinsics.rs
Lines 2521 to 2570 in ee9c7c9
/// Returns whether the argument's value is statically known at | |
/// compile-time. | |
/// | |
/// This is useful when there is a way of writing the code that will | |
/// be *faster* when some variables have known values, but *slower* | |
/// in the general case: an `if is_val_statically_known(var)` can be used | |
/// to select between these two variants. The `if` will be optimized away | |
/// and only the desired branch remains. | |
/// | |
/// Formally speaking, this function non-deterministically returns `true` | |
/// or `false`, and the caller has to ensure sound behavior for both cases. | |
/// In other words, the following code has *Undefined Behavior*: | |
/// | |
/// ```no_run | |
/// #![feature(is_val_statically_known)] | |
/// #![feature(core_intrinsics)] | |
/// # #![allow(internal_features)] | |
/// use std::hint::unreachable_unchecked; | |
/// use std::intrinsics::is_val_statically_known; | |
/// | |
/// unsafe { | |
/// if !is_val_statically_known(0) { unreachable_unchecked(); } | |
/// } | |
/// ``` | |
/// | |
/// This also means that the following code's behavior is unspecified; it | |
/// may panic, or it may not: | |
/// | |
/// ```no_run | |
/// #![feature(is_val_statically_known)] | |
/// #![feature(core_intrinsics)] | |
/// # #![allow(internal_features)] | |
/// use std::intrinsics::is_val_statically_known; | |
/// | |
/// unsafe { | |
/// assert_eq!(is_val_statically_known(0), is_val_statically_known(0)); | |
/// } | |
/// ``` | |
/// | |
/// Unsafe code may not rely on `is_val_statically_known` returning any | |
/// particular value, ever. However, the compiler will generally make it | |
/// return `true` only if the value of the argument is actually known. | |
/// | |
/// When calling this in a `const fn`, both paths must be semantically | |
/// equivalent, that is, the result of the `true` branch and the `false` | |
/// branch must return the same value and have the same side-effects *no | |
/// matter what*. | |
#[rustc_const_unstable(feature = "is_val_statically_known", issue = "none")] | |
#[rustc_nounwind] | |
pub fn is_val_statically_known<T: Copy>(arg: T) -> bool; |
Summary
Per #121064 (comment) comment by @Nilstrieb, is_val_statically_known
only supports primitive types - which is not listed anywhere in the documentation.
When trying to use inside the core library on core::fmt::Arguments
, compiler crashes #121066.
CC: @NCGThompson
Metadata
Metadata
Assignees
Labels
A-contributor-roadblockArea: Makes things more difficult for new or seasoned contributors to RustArea: Makes things more difficult for new or seasoned contributors to RustA-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsF-core_intrinsicsIssue in the "core intrinsics" for internal usage only.Issue in the "core intrinsics" for internal usage only.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.