Skip to content

document that t-lang does not need involvement for unobservable intrisics - #161675

Open
RalfJung wants to merge 1 commit into
rust-lang:mainfrom
RalfJung:intrinsic-approval
Open

document that t-lang does not need involvement for unobservable intrisics#161675
RalfJung wants to merge 1 commit into
rust-lang:mainfrom
RalfJung:intrinsic-approval

Conversation

@RalfJung

@RalfJung RalfJung commented Aug 24, 2026

Copy link
Copy Markdown
Member

This turns the FCP about intrinsics that could already be written on stable into documentation.

Also use this opportunity to document miri::intrinsic_fallback_is_spec.

r? @tgross35
Cc @rust-lang/lang
Should only land once the FCP completes!

@rustbot

rustbot commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

⚠️ #[rustc_intrinsic_const_stable_indirect] controls whether intrinsics can be exposed to stable const
code; adding it needs t-lang approval.

cc @rust-lang/wg-const-eval

⚠️ #[miri::intrinsic_fallback_is_spec] must only be used if the function actively checks for all UB cases,
and explores the possible non-determinism of the intrinsic.

cc @rust-lang/miri

Any special-casing of Miri in the standard library requires review.

cc @rust-lang/miri

Some changes occurred to the intrinsics. Make sure the CTFE / Miri interpreter
gets adapted for the changes, if necessary.

cc @rust-lang/miri, @oli-obk, @lcnr

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Aug 24, 2026
@rustbot

rustbot commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

tgross35 is currently at their maximum review capacity.
They may take a while to respond.

@RalfJung
RalfJung force-pushed the intrinsic-approval branch from e04e762 to 453be15 Compare August 24, 2026 14:12
@rust-log-analyzer

This comment has been minimized.

@RalfJung
RalfJung force-pushed the intrinsic-approval branch from 453be15 to 93c8b74 Compare August 24, 2026 14:23
Comment on lines +13 to +35
//! Intrinsics don't need a body. However, they optionally can have a body, which we call the
//! "fallback body". This will be used by codegen backends that do not have a dedicated
//! implementation of the intrinsic, making it easier to add new intrinsics for specific operations
//! without having to implement them in each codegen backend. The fallback body obviously has to be
//! a valid implementation of the documented specification of the intrinsic. In some cases, the
//! fallback body will be *equivalent* to the specification. Note that this is a strong requirement:
//! if the spec says "UB if input `x` is even", then a valid implementation can just ignore this and
//! do whatever it wants in that case; an *equivalent* implementation needs to actually check this
//! condition and trigger UB in that case (e.g. by using `hint::assert_unchecked()`). Similar, if
//! the spec says "returns `x` or `y` non-deterministically", then an *equivalent* implementation
//! must actually do non-deterministic choice and return either value (e.g. by invoking some other
//! language operation that has the same non-determinism). Intrinsics with such a fallback body that
//! is equivalent to the spec may be marked with `#[miri::intrinsic_fallback_is_spec]`; the fallback
//! body will then also be used by Miri for UB checking. When in doubt, do not use this attribute or
//! ask the Miri maintainers for advice.
//!
//! Intrinsics are, in general, language extensions. Therefore, t-lang should be involved whenever a
//! new intrinsic is exposed to stable code. However, if an intrinsic is marked
//! `#[miri::intrinsic_fallback_is_spec]` with a fallback body that only uses stable features (or if
//! such a fallback body could be written, but for one reason or another the actual fallback body is
//! different), and if it also does not make other promises that go beyond observable program
//! behavior (such as steering the optimizer in a particular direction), then an intrinsic may be
//! used without t-lang involvement.

@Urgau Urgau Aug 24, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a remark on my side, no need to do anything about it. This is quite a lot a word to say that if a intrinsic does something new (language wise, ie not using existing language features) it should be validated by T-lang, and everything else just need T-compiler approval.

View changes since the review

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first paragraph explains a lot more than that. It explains the intrinsic_fallback_is_spec which is non-trivial, that's why I used so many words for it.

The second paragraph explains what you summarized. Happy to make it shorter if you have suggestions for how to concretely do that. It's non-trivial to say precisely what "something new" means.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants