diff options
| author | Oli Scherer <github35764891676564198441@oli-obk.de> | 2021-06-15 10:04:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-15 17:04:54 +0900 |
| commit | ba3c0b898e6f067149dafcc2d5bb54b202d2000c (patch) | |
| tree | 926bd2a95e59ce1d893886d29ba853d28fed1b31 /src/doc/rustc-dev-guide | |
| parent | e6951546189821d47abac7b7a178c3b8a4e0d0cf (diff) | |
| download | rust-ba3c0b898e6f067149dafcc2d5bb54b202d2000c.tar.gz rust-ba3c0b898e6f067149dafcc2d5bb54b202d2000c.zip | |
We stopped using allow_internal_unstable a while ago (#1142)
Co-authored-by: Ralf Jung <post@ralfj.de> Co-authored-by: Yuki Okushi <jtitor@2k36.org> Co-authored-by: Noah Lev <camelidcamel@gmail.com>
Diffstat (limited to 'src/doc/rustc-dev-guide')
| -rw-r--r-- | src/doc/rustc-dev-guide/src/stability.md | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/doc/rustc-dev-guide/src/stability.md b/src/doc/rustc-dev-guide/src/stability.md index d3221217ad4..0f1aec17ee9 100644 --- a/src/doc/rustc-dev-guide/src/stability.md +++ b/src/doc/rustc-dev-guide/src/stability.md @@ -92,24 +92,32 @@ and the associated ## allow_internal_unstable -Macros, compiler desugarings and `const fn`s expose their bodies to the call +Macros and compiler desugarings expose their bodies to the call site. To work around not being able to use unstable things in the standard library's macros, there's the `#[allow_internal_unstable(feature1, feature2)]` -attribute that allows the given features to be used in stable macros or -`const fn`s. - -Note that `const fn`s are even more special in this regard. You can't just -allow any feature, the features need an implementation in -`qualify_min_const_fn.rs`. For example the `const_fn_union` feature gate allows -accessing fields of unions inside stable `const fn`s. The rules for when it's -ok to use such a feature gate are that behavior matches the runtime behavior of -the same code (see also [this blog post][blog]). This means that you may not -create a `const fn` that e.g. transmutes a memory address to an integer, +attribute that allows the given features to be used in stable macros. + +## rustc_allow_const_fn_unstable + +`const fn`, while not directly exposing their body to the world, are going to get +evaluated at compile time in stable crates. If their body does something const-unstable, +that could lock us into certain features indefinitely by accident. Thus no unstable const +features are allowed inside stable `const fn`. + +However, sometimes we do know that a feature will get +stabilized, just not when, or there is a stable (but e.g. runtime-slow) workaround, so we +could always fall back to some stable version if we scrapped the unstable feature. +In those cases, the rustc_allow_const_fn_unstable attribute can be used to allow some +unstable features in the body of a stable `const fn`. + +You also need to take care to uphold the `const fn` invariant that calling it at runtime and +compile-time needs to behave the same (see also [this blog post][blog]). This means that you +may not create a `const fn` that e.g. transmutes a memory address to an integer, because the addresses of things are nondeterministic and often unknown at compile-time. -Always ping @oli-obk, @RalfJung, and @Centril if you are adding more -`allow_internal_unstable` attributes to any `const fn` +Always ping @rust-lang/wg-const-eval if you are adding more +`rustc_allow_const_fn_unstable` attributes to any `const fn`. ## staged_api |
