about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2025-07-03 20:05:02 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2025-09-27 11:29:49 +0200
commitef8b2a26caccba46584e4753c3091218d4a2e17d (patch)
treed0115f8e3f6492f3028394363334f75c2ad58e83
parent6fecff45d915b31eee3170f32fedb6db045611f1 (diff)
downloadrust-ef8b2a26caccba46584e4753c3091218d4a2e17d.tar.gz
rust-ef8b2a26caccba46584e4753c3091218d4a2e17d.zip
Correctly handle target_feature in rustdoc cfg
-rw-r--r--src/librustdoc/clean/types.rs37
1 files changed, 11 insertions, 26 deletions
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index 605b77109a0..c8e9f3dc479 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -1153,35 +1153,20 @@ pub(crate) fn extract_cfg_from_attrs<'a, I: Iterator<Item = &'a hir::Attribute>
     // If there is no `doc(cfg())`, then we retrieve the `cfg()` attributes (because
     // `doc(cfg())` overrides `cfg()`).
     for attr in attrs {
-        let Some(ident) = attr.ident() else { continue };
-        match ident.name {
-            sym::cfg | sym::cfg_trace if !cfg_info.parent_is_doc_cfg => {
-                if let Some(attr) = single(attr.meta_item_list()?)
-                    && let Ok(new_cfg) = Cfg::parse(&attr)
-                {
-                    cfg_info.current_cfg &= new_cfg;
-                }
-            }
+        if let hir::Attribute::Parsed(AttributeKind::TargetFeature { features, .. }) = attr {
             // treat #[target_feature(enable = "feat")] attributes as if they were
             // #[doc(cfg(target_feature = "feat"))] attributes as well
-            sym::target_feature
-                if let Some(attrs) = attr.meta_item_list() =>
-            {
-                for attr in attrs {
-                    if attr.has_name(sym::enable) && attr.value_str().is_some() {
-                        // Clone `enable = "feat"`, change to `target_feature = "feat"`.
-                        // Unwrap is safe because `value_str` succeeded above.
-                        let mut meta = attr.meta_item().unwrap().clone();
-                        meta.path =
-                            ast::Path::from_ident(Ident::with_dummy_span(sym::target_feature));
-
-                        if let Ok(feat_cfg) = Cfg::parse(&ast::MetaItemInner::MetaItem(meta)) {
-                            cfg_info.current_cfg &= feat_cfg;
-                        }
-                    }
-                }
+            for (feature, _) in features {
+                cfg_info.current_cfg &= Cfg::Cfg(sym::target_feature, Some(*feature));
             }
-            _ => {}
+            continue;
+        } else if !cfg_info.parent_is_doc_cfg
+            && let Some(ident) = attr.ident()
+            && matches!(ident.name, sym::cfg | sym::cfg_trace)
+            && let Some(attr) = single(attr.meta_item_list()?)
+            && let Ok(new_cfg) = Cfg::parse(&attr)
+        {
+            cfg_info.current_cfg &= new_cfg;
         }
     }