Document that t-lang does not need involvement for unobservable intrinsics - #161675
Conversation
|
cc @rust-lang/wg-const-eval
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 |
|
|
e04e762 to
453be15
Compare
This comment has been minimized.
This comment has been minimized.
453be15 to
93c8b74
Compare
| //! 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. |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
|
@bors r=traviscross,Urgau rollup |
…viscross,Urgau document that t-lang does not need involvement for unobservable intrisics This turns the [FCP](rust-lang#161081 (comment)) (completed [here](rust-lang#161081 (comment))) 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
…viscross,Urgau document that t-lang does not need involvement for unobservable intrisics This turns the [FCP](rust-lang#161081 (comment)) (completed [here](rust-lang#161081 (comment))) 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
…uwer Rollup of 11 pull requests Successful merges: - #162752 (`rust-analyzer` subtree update) - #161868 (libtest: never iterate over all tests in `--exact` mode) - #161903 (Fix initialization cycle in `target_config`) - #162240 (Garbage-collect old incremental compilation sessions) - #161675 (document that t-lang does not need involvement for unobservable intrisics) - #162630 (Simplify the `G` in `Diag<'a, G>`) - #162647 (Add regression test for previous overflow evaluating the requirement) - #162703 (regression test for valtree leaf const) - #162723 (Add regression test for unexpected type for constructor) - #162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - #162736 (clean up trivial region constraint filtering)
…viscross,Urgau document that t-lang does not need involvement for unobservable intrisics This turns the [FCP](rust-lang#161081 (comment)) (completed [here](rust-lang#161081 (comment))) 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
…uwer Rollup of 15 pull requests Successful merges: - #162752 (`rust-analyzer` subtree update) - #161903 (Fix initialization cycle in `target_config`) - #162240 (Garbage-collect old incremental compilation sessions) - #162610 (fix tailcall indirect return) - #162634 (Implement semantic analysis for named `Fn` trait params) - #161675 (document that t-lang does not need involvement for unobservable intrisics) - #162160 (turn aligned-in-packed error into lint) - #162504 (Stabilize `unsafe_cell_access`) - #162516 (tidy: Sort multi-line types by treating `>` as a closing bracket) - #162630 (Simplify the `G` in `Diag<'a, G>`) - #162647 (Add regression test for previous overflow evaluating the requirement) - #162703 (regression test for valtree leaf const) - #162723 (Add regression test for unexpected type for constructor) - #162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - #162736 (clean up trivial region constraint filtering)
…uwer Rollup of 16 pull requests Successful merges: - #162762 (Subtree sync for rustc_codegen_cranelift) - #162752 (`rust-analyzer` subtree update) - #161903 (Fix initialization cycle in `target_config`) - #162240 (Garbage-collect old incremental compilation sessions) - #162610 (fix tailcall indirect return) - #162634 (Implement semantic analysis for named `Fn` trait params) - #161675 (document that t-lang does not need involvement for unobservable intrisics) - #162160 (turn aligned-in-packed error into lint) - #162504 (Stabilize `unsafe_cell_access`) - #162516 (tidy: Sort multi-line types by treating `>` as a closing bracket) - #162630 (Simplify the `G` in `Diag<'a, G>`) - #162647 (Add regression test for previous overflow evaluating the requirement) - #162703 (regression test for valtree leaf const) - #162723 (Add regression test for unexpected type for constructor) - #162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - #162736 (clean up trivial region constraint filtering)
Rollup merge of #161675 - RalfJung:intrinsic-approval, r=traviscross,Urgau document that t-lang does not need involvement for unobservable intrisics This turns the [FCP](#161081 (comment)) (completed [here](#161081 (comment))) 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
…uwer Rollup of 16 pull requests Successful merges: - rust-lang/rust#162762 (Subtree sync for rustc_codegen_cranelift) - rust-lang/rust#162752 (`rust-analyzer` subtree update) - rust-lang/rust#161903 (Fix initialization cycle in `target_config`) - rust-lang/rust#162240 (Garbage-collect old incremental compilation sessions) - rust-lang/rust#162610 (fix tailcall indirect return) - rust-lang/rust#162634 (Implement semantic analysis for named `Fn` trait params) - rust-lang/rust#161675 (document that t-lang does not need involvement for unobservable intrisics) - rust-lang/rust#162160 (turn aligned-in-packed error into lint) - rust-lang/rust#162504 (Stabilize `unsafe_cell_access`) - rust-lang/rust#162516 (tidy: Sort multi-line types by treating `>` as a closing bracket) - rust-lang/rust#162630 (Simplify the `G` in `Diag<'a, G>`) - rust-lang/rust#162647 (Add regression test for previous overflow evaluating the requirement) - rust-lang/rust#162703 (regression test for valtree leaf const) - rust-lang/rust#162723 (Add regression test for unexpected type for constructor) - rust-lang/rust#162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - rust-lang/rust#162736 (clean up trivial region constraint filtering)
…uwer Rollup of 16 pull requests Successful merges: - rust-lang/rust#162762 (Subtree sync for rustc_codegen_cranelift) - rust-lang/rust#162752 (`rust-analyzer` subtree update) - rust-lang/rust#161903 (Fix initialization cycle in `target_config`) - rust-lang/rust#162240 (Garbage-collect old incremental compilation sessions) - rust-lang/rust#162610 (fix tailcall indirect return) - rust-lang/rust#162634 (Implement semantic analysis for named `Fn` trait params) - rust-lang/rust#161675 (document that t-lang does not need involvement for unobservable intrisics) - rust-lang/rust#162160 (turn aligned-in-packed error into lint) - rust-lang/rust#162504 (Stabilize `unsafe_cell_access`) - rust-lang/rust#162516 (tidy: Sort multi-line types by treating `>` as a closing bracket) - rust-lang/rust#162630 (Simplify the `G` in `Diag<'a, G>`) - rust-lang/rust#162647 (Add regression test for previous overflow evaluating the requirement) - rust-lang/rust#162703 (regression test for valtree leaf const) - rust-lang/rust#162723 (Add regression test for unexpected type for constructor) - rust-lang/rust#162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - rust-lang/rust#162736 (clean up trivial region constraint filtering)
…uwer Rollup of 16 pull requests Successful merges: - rust-lang/rust#162762 (Subtree sync for rustc_codegen_cranelift) - rust-lang/rust#162752 (`rust-analyzer` subtree update) - rust-lang/rust#161903 (Fix initialization cycle in `target_config`) - rust-lang/rust#162240 (Garbage-collect old incremental compilation sessions) - rust-lang/rust#162610 (fix tailcall indirect return) - rust-lang/rust#162634 (Implement semantic analysis for named `Fn` trait params) - rust-lang/rust#161675 (document that t-lang does not need involvement for unobservable intrisics) - rust-lang/rust#162160 (turn aligned-in-packed error into lint) - rust-lang/rust#162504 (Stabilize `unsafe_cell_access`) - rust-lang/rust#162516 (tidy: Sort multi-line types by treating `>` as a closing bracket) - rust-lang/rust#162630 (Simplify the `G` in `Diag<'a, G>`) - rust-lang/rust#162647 (Add regression test for previous overflow evaluating the requirement) - rust-lang/rust#162703 (regression test for valtree leaf const) - rust-lang/rust#162723 (Add regression test for unexpected type for constructor) - rust-lang/rust#162735 (Remove pointless `A: Allocator` bounds in boxed.rs) - rust-lang/rust#162736 (clean up trivial region constraint filtering)
This turns the FCP (completed here) 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