Update const-stability rules because we're not in min-const-fn times any more #129815
Description
The rustc_const_unstable
/rustc_const_stable
system was designed in a time when most const fn
in the standard library were not meant to be const-stable, no matter whether they are #[stable]
or #[unstable]
. However, as time passes, it becomes more and more common that functions are const fn
from the start, and become const-stable the same time they become stable. So maybe we should reconsider some aspects of that system.
In particular, I think it would make sense to treat a function like this
#[unstable(...)]
const fn foo() {}
as-if it also carried a rustc_const_unstable
attribute (with the same feature gate and issue as the unstable
attribute). That would avoid confusion such as what we saw here.
The more interesting question is what to do with
#[stable(...)]
const fn foo() {}
If the body of the function doesn't do anything const-unstable, it seems fine to just treat this as const-stable, maybe? Or do we want to still force people to add an explicit rustc_const_stable
? I am not sure I see the value in that -- the dangerous case is when that function calls some const-unstable things, such as const-unstable intrinsics. That will still require rustc_allow_const_fn_unstable
, and that is the point where we have to ensure we get involved.
To avoid any kind of accidental changes, we probably want to start by making it an error for a const fn
to carry stable
or unstable
without also carrying rustc_const_stable
or rustc_const_unstable
. I had a brief look at the stability system but couldn't find an obvious place to add such a lint; so if someone has an idea please let me know. :)
And speaking of rustc_allow_const_fn_unstable
-- I feel like the way we use that also may need to change. A lot of the current uses of that attribute are a case of "some public stable function is implemented using still-unstable functions" -- but the still-unstable functions are not actually doing anything funky const-wise. They could be marked rustc_const_stable
, meaning "wg-const-eval approved their use on stable", even while t-libs-api still debates whether the API itself (independent of its const
usage) should exist on stable.
Cc @rust-lang/wg-const-eval
Activity