-
Notifications
You must be signed in to change notification settings - Fork 13.9k
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.