diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index f0707cfbbb40..b908a6c6e843 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -44,7 +44,7 @@ use rustc_session::cstore::{CrateStoreDyn, Untracked}; use rustc_session::lint::Lint; use rustc_span::def_id::{CRATE_DEF_ID, DefPathHash, StableCrateId}; -use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw}; +use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym}; use rustc_type_ir::TyKind::*; pub use rustc_type_ir::lift::Lift; use rustc_type_ir::{CollectAndApply, TypeFlags, WithCachedTypeInfo, elaborate, search_graph}; @@ -1705,6 +1705,10 @@ struct UnusedFeature { // in downstream crates. It should never be linted, but should we // hack this in the linter to ignore it? && f.as_str() != "restricted_std" + // `doc_cfg` affects rustdoc behavior: rustdoc checks it via + // `tcx.features().doc_cfg()`, but a normal rustc compilation may + // never observe that use. Do not lint it as unused here. + && *f != sym::doc_cfg }) .collect::>(); diff --git a/tests/ui/lint/unused-features/used-doc-cfg.rs b/tests/ui/lint/unused-features/used-doc-cfg.rs new file mode 100644 index 000000000000..edd1dd6b10ce --- /dev/null +++ b/tests/ui/lint/unused-features/used-doc-cfg.rs @@ -0,0 +1,10 @@ +//@ check-pass +//@ compile-flags: --check-cfg=cfg(feature,values("enabled_feature")) +// Regression test for https://github.com/rust-lang/rust/issues/154487 + +#![crate_type = "lib"] +#![deny(unused_features)] +#![feature(doc_cfg)] + +#[cfg(feature = "enabled_feature")] +pub fn foo() {}