Auto merge of #152452 - ShE3py:overruled-lint, r=BoxyUwU

feat: show what lint was overruled

We can't `#[allow]` a whole lint group if any of its members is forbidden, but the offending member is not currently shown if it was forbidden from the command line.

Before/after:
```diff
 $ rustc -F dead_code - <<< '#![allow(unused)]'
 error[E0453]: allow(unused) incompatible with previous forbid
  --> <anon>:1:10
   |
 1 | #![allow(unused)]
   |          ^^^^^^ overruled by previous forbid
   |
-  = note: `forbid` lint level was set on command line
+  = note: `forbid` lint level was set on command line (`-F dead_code`)
 
 error: aborting due to 1 previous error
```

@rustbot label +A-diagnostics +A-lints +D-terse
This commit is contained in:
bors 2026-02-15 20:05:05 +00:00
commit 139651428d
8 changed files with 36 additions and 13 deletions

View file

@ -20,7 +20,7 @@ pub(crate) struct OverruledAttribute<'a> {
pub(crate) enum OverruledAttributeSub {
DefaultSource { id: String },
NodeSource { span: Span, reason: Option<Symbol> },
CommandLineSource,
CommandLineSource { id: Symbol },
}
impl Subdiagnostic for OverruledAttributeSub {
@ -36,8 +36,9 @@ impl Subdiagnostic for OverruledAttributeSub {
diag.note(rationale.to_string());
}
}
OverruledAttributeSub::CommandLineSource => {
diag.note(msg!("`forbid` lint level was set on command line"));
OverruledAttributeSub::CommandLineSource { id } => {
diag.note(msg!("`forbid` lint level was set on command line (`-F {$id}`)"));
diag.arg("id", id);
}
}
}

View file

@ -580,7 +580,9 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
LintLevelSource::Node { span, reason, .. } => {
OverruledAttributeSub::NodeSource { span, reason }
}
LintLevelSource::CommandLine(_, _) => OverruledAttributeSub::CommandLineSource,
LintLevelSource::CommandLine(name, _) => {
OverruledAttributeSub::CommandLineSource { id: name }
}
};
if !fcw_warning {
self.sess.dcx().emit_err(OverruledAttribute {