about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-12-02 11:02:22 +0100
committerRalf Jung <post@ralfj.de>2024-12-11 22:18:51 +0100
commit60eca2c5758a736559a60b7552833d20b0895763 (patch)
treed63365f463b918f30b9d63aca6ec7a7a9ad6da5d
parentd6ddc73daeb27fc3b5b009105185c44621c3c7cb (diff)
downloadrust-60eca2c5758a736559a60b7552833d20b0895763.tar.gz
rust-60eca2c5758a736559a60b7552833d20b0895763.zip
apply review feedback
-rw-r--r--compiler/rustc_codegen_gcc/src/gcc_util.rs4
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm_util.rs8
-rw-r--r--compiler/rustc_codegen_ssa/src/target_features.rs4
-rw-r--r--compiler/rustc_target/src/target_features.rs34
4 files changed, 32 insertions, 18 deletions
diff --git a/compiler/rustc_codegen_gcc/src/gcc_util.rs b/compiler/rustc_codegen_gcc/src/gcc_util.rs
index 3717e12020f..88e5eefd7a1 100644
--- a/compiler/rustc_codegen_gcc/src/gcc_util.rs
+++ b/compiler/rustc_codegen_gcc/src/gcc_util.rs
@@ -95,7 +95,9 @@ pub(crate) fn global_gcc_features(sess: &Session, diagnostics: bool) -> Vec<Stri
                         sess.dcx().emit_warn(unknown_feature);
                     }
                     Some((_, stability, _)) => {
-                        if let Err(reason) = stability.compute(&sess.target).allow_toggle() {
+                        if let Err(reason) =
+                            stability.compute_toggleability(&sess.target).allow_toggle()
+                        {
                             sess.dcx().emit_warn(ForbiddenCTargetFeature { feature, reason });
                         } else if stability.requires_nightly().is_some() {
                             // An unstable feature. Warn about using it. (It makes little sense
diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs
index 3f53856f98d..bfec7d708cf 100644
--- a/compiler/rustc_codegen_llvm/src/llvm_util.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs
@@ -717,12 +717,14 @@ pub(crate) fn global_llvm_features(
                             sess.dcx().emit_warn(unknown_feature);
                         }
                         Some((_, stability, _)) => {
-                            if let Err(reason) = stability.compute(&sess.target).allow_toggle() {
+                            if let Err(reason) =
+                                stability.compute_toggleability(&sess.target).allow_toggle()
+                            {
                                 sess.dcx().emit_warn(ForbiddenCTargetFeature { feature, reason });
                             } else if stability.requires_nightly().is_some() {
-                                // An unstable feature. Warn about using it. (It makes little sense
+                                // An unstable feature. Warn about using it. It makes little sense
                                 // to hard-error here since we just warn about fully unknown
-                                // features above).
+                                // features above.
                                 sess.dcx().emit_warn(UnstableCTargetFeature { feature });
                             }
                         }
diff --git a/compiler/rustc_codegen_ssa/src/target_features.rs b/compiler/rustc_codegen_ssa/src/target_features.rs
index b3057325bd6..fa600ec7166 100644
--- a/compiler/rustc_codegen_ssa/src/target_features.rs
+++ b/compiler/rustc_codegen_ssa/src/target_features.rs
@@ -153,14 +153,14 @@ pub(crate) fn provide(providers: &mut Providers) {
                 // rustdoc needs to be able to document functions that use all the features, so
                 // whitelist them all
                 rustc_target::target_features::all_rust_features()
-                    .map(|(a, b)| (a.to_string(), b.compute(target)))
+                    .map(|(a, b)| (a.to_string(), b.compute_toggleability(target)))
                     .collect()
             } else {
                 tcx.sess
                     .target
                     .rust_target_features()
                     .iter()
-                    .map(|&(a, b, _)| (a.to_string(), b.compute(target)))
+                    .map(|&(a, b, _)| (a.to_string(), b.compute_toggleability(target)))
                     .collect()
             }
         },
diff --git a/compiler/rustc_target/src/target_features.rs b/compiler/rustc_target/src/target_features.rs
index d5da130aa6c..b8b0e0c7d59 100644
--- a/compiler/rustc_target/src/target_features.rs
+++ b/compiler/rustc_target/src/target_features.rs
@@ -17,17 +17,17 @@ pub const RUSTC_SPECIFIC_FEATURES: &[&str] = &["crt-static"];
 pub const RUSTC_SPECIAL_FEATURES: &[&str] = &["backchain"];
 
 /// Stability information for target features.
-/// `AllowToggle` is the type storing whether (un)stable features can be toggled:
+/// `Toggleability` is the type storing whether (un)stable features can be toggled:
 /// this is initially a function since it can depend on `Target`, but for stable hashing
 /// it needs to be something hashable to we have to make the type generic.
 #[derive(Debug, Clone, Copy)]
-pub enum Stability<AllowToggle> {
+pub enum Stability<Toggleability> {
     /// This target feature is stable, it can be used in `#[target_feature]` and
     /// `#[cfg(target_feature)]`.
     Stable {
-        /// When enabling/dsiabling the feature via `-Ctarget-feature` or `#[target_feature]`,
+        /// When enabling/disabling the feature via `-Ctarget-feature` or `#[target_feature]`,
         /// determine if that is allowed.
-        allow_toggle: AllowToggle,
+        allow_toggle: Toggleability,
     },
     /// This target feature is unstable. It is only present in `#[cfg(target_feature)]` on
     /// nightly and using it in `#[target_feature]` requires enabling the given nightly feature.
@@ -36,7 +36,7 @@ pub enum Stability<AllowToggle> {
         /// feature gate!
         nightly_feature: Symbol,
         /// See `Stable::allow_toggle` comment above.
-        allow_toggle: AllowToggle,
+        allow_toggle: Toggleability,
     },
     /// This feature can not be set via `-Ctarget-feature` or `#[target_feature]`, it can only be
     /// set in the basic target definition. It is never set in `cfg(target_feature)`. Used in
@@ -50,7 +50,7 @@ pub type StabilityUncomputed = Stability<fn(&Target) -> Result<(), &'static str>
 /// `Stability` where `allow_toggle` has already been computed.
 pub type StabilityComputed = Stability<Result<(), &'static str>>;
 
-impl<CTX, AllowToggle: HashStable<CTX>> HashStable<CTX> for Stability<AllowToggle> {
+impl<CTX, Toggleability: HashStable<CTX>> HashStable<CTX> for Stability<Toggleability> {
     #[inline]
     fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
         std::mem::discriminant(self).hash_stable(hcx, hasher);
@@ -69,15 +69,22 @@ impl<CTX, AllowToggle: HashStable<CTX>> HashStable<CTX> for Stability<AllowToggl
     }
 }
 
-impl<AllowToggle> Stability<AllowToggle> {
-    /// Returns whether the feature can be queried in `cfg` ever.
-    /// (It might still be nightly-only even if this returns `true`).
+impl<Toggleability> Stability<Toggleability> {
+    /// Returns whether the feature can be used in `cfg(target_feature)` ever.
+    /// (It might still be nightly-only even if this returns `true`, so make sure to also check
+    /// `requires_nightly`.)
     pub fn in_cfg(self) -> bool {
         !matches!(self, Stability::Forbidden { .. })
     }
 
-    /// Returns the nightly feature that is required to toggle or query this target feature. Ensure
-    /// to also check `allow_toggle()` before allowing to toggle!
+    /// Returns the nightly feature that is required to toggle this target feature via
+    /// `#[target_feature]`/`-Ctarget-feature` or to test it via `cfg(target_feature)`.
+    /// (For `cfg` we only care whether the feature is nightly or not, we don't require
+    /// the feature gate to actually be enabled when using a nightly compiler.)
+    ///
+    /// Before calling this, ensure the feature is even permitted for this use:
+    /// - for `#[target_feature]`/`-Ctarget-feature`, check `allow_toggle()`
+    /// - for `cfg(target_feature)`, check `in_cfg`
     pub fn requires_nightly(self) -> Option<Symbol> {
         match self {
             Stability::Unstable { nightly_feature, .. } => Some(nightly_feature),
@@ -88,7 +95,7 @@ impl<AllowToggle> Stability<AllowToggle> {
 }
 
 impl StabilityUncomputed {
-    pub fn compute(self, target: &Target) -> StabilityComputed {
+    pub fn compute_toggleability(self, target: &Target) -> StabilityComputed {
         use Stability::*;
         match self {
             Stable { allow_toggle } => Stable { allow_toggle: allow_toggle(target) },
@@ -101,6 +108,9 @@ impl StabilityUncomputed {
 }
 
 impl StabilityComputed {
+    /// Returns whether the feature may be toggled via `#[target_feature]` or `-Ctarget-feature`.
+    /// (It might still be nightly-only even if this returns `true`, so make sure to also check
+    /// `requires_nightly`.)
     pub fn allow_toggle(self) -> Result<(), &'static str> {
         match self {
             Stability::Stable { allow_toggle } => allow_toggle,