Auto merge of #131321 - RalfJung:feature-activation, r=nnethercote
terminology: #[feature] *enables* a feature (instead of "declaring" or "activating" it)
Mostly, we currently call a feature that has a corresponding `#[feature(name)]` attribute in the current crate a "declared" feature. I think that is confusing as it does not align with what "declaring" usually means. Furthermore, we *also* refer to `#[stable]`/`#[unstable]` as *declaring* a feature (e.g. in [these diagnostics](f25e5abea2/compiler/rustc_passes/messages.ftl (L297-L301)
)), which aligns better with what "declaring" usually means. To make things worse, the functions `tcx.features().active(...)` and `tcx.features().declared(...)` both exist and they are doing almost the same thing (testing whether a corresponding `#[feature(name)]` exists) except that `active` would ICE if the feature is not an unstable lang feature. On top of this, the callback when a feature is activated/declared is called `set_enabled`, and many comments also talk about "enabling" a feature.
So really, our terminology is just a mess.
I would suggest we use "declaring a feature" for saying that something is/was guarded by a feature (e.g. `#[stable]`/`#[unstable]`), and "enabling a feature" for `#[feature(name)]`. This PR implements that.
This commit is contained in:
commit
bca5fdebe0
21 changed files with 153 additions and 131 deletions
|
@ -422,15 +422,15 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
debug!("stability: skipping span={:?} since it is internal", span);
|
||||
return EvalResult::Allow;
|
||||
}
|
||||
if self.features().declared(feature) {
|
||||
if self.features().enabled(feature) {
|
||||
return EvalResult::Allow;
|
||||
}
|
||||
|
||||
// If this item was previously part of a now-stabilized feature which is still
|
||||
// active (i.e. the user hasn't removed the attribute for the stabilized feature
|
||||
// enabled (i.e. the user hasn't removed the attribute for the stabilized feature
|
||||
// yet) then allow use of this item.
|
||||
if let Some(implied_by) = implied_by
|
||||
&& self.features().declared(implied_by)
|
||||
&& self.features().enabled(implied_by)
|
||||
{
|
||||
return EvalResult::Allow;
|
||||
}
|
||||
|
@ -509,7 +509,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
debug!("body stability: skipping span={:?} since it is internal", span);
|
||||
return EvalResult::Allow;
|
||||
}
|
||||
if self.features().declared(feature) {
|
||||
if self.features().enabled(feature) {
|
||||
return EvalResult::Allow;
|
||||
}
|
||||
|
||||
|
|
|
@ -3093,7 +3093,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
Some(stability) if stability.is_const_unstable() => {
|
||||
// has a `rustc_const_unstable` attribute, check whether the user enabled the
|
||||
// corresponding feature gate.
|
||||
self.features().declared(stability.feature)
|
||||
self.features().enabled(stability.feature)
|
||||
}
|
||||
// functions without const stability are either stable user written
|
||||
// const fn or the user is using feature gates and we thus don't
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue