-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Description
While working on cfg-related things in rustdoc, I noticed that clippy has 8 uses of sym::cfg and 2 uses of sym::cfg_attr. Most of these usages are probably fine but some should probably be replaced with sym::cfg_trace and sym::cfg_attr_trace, respectively.
Since rust-lang/rust#138844 and rust-lang/rust#138515 (March 2025), expanded active #[cfg{,_attr}]s get lowered to so-called traces. Meaning, when you're dealing with something that's running post-expansion, checking if the list of attributes of some given thing contains sym::cfg or sym::cfg_attr will always return false. For pre-expansion lints (etc.) on the other hand, it that should still work.
For example I found fn is_hir_ty_cfg_dependant:
rust-clippy/clippy_utils/src/lib.rs
Lines 2275 to 2282 in 35e55a6
| pub fn is_hir_ty_cfg_dependant(cx: &LateContext<'_>, ty: &hir::Ty<'_>) -> bool { | |
| if let TyKind::Path(QPath::Resolved(_, path)) = ty.kind | |
| && let Res::Def(_, def_id) = path.res | |
| { | |
| return cx.tcx.has_attr(def_id, sym::cfg) || cx.tcx.has_attr(def_id, sym::cfg_attr); | |
| } | |
| false | |
| } |
which is to be used in LateContexts & HIR types (meaning: post-expansion) but it actually checks sym::cfg and sym::cfg_attr! This is quite clearly a bug! I wager that this function always returns false. Locally, I did modify it to check cfg_trace and cfg_attr_trace instead and no unit or UI tests failed, so this seems severely undertested.
As for concrete consequences / bugs, consider the following code which currently triggers the lint char-lit-as-u8 despite <Casts as LateLintPass>::check_expr returning early if the cast-to type is cfg-dependent:
#![deny(clippy::char_lit_as_u8)]
#[cfg(true)]
type Char = u8;
fn main() {
let _ = 'x' as Char; //~ char_lit_as_u8
}With my local +_trace modification, the lint no longer fires which was the original intention of the lint pass author(s).
Indeed, if you replace true with all() and run clippy-driver +nightly-2025-03-27 file.rs (the last nightly before the aforementioned rust-lang/rust#138844 landed) this compiles / the lint gets suppressed.