Force warnings even when can_emit_warnings == false

This commit is contained in:
Ryan Levick 2021-06-04 14:37:20 +02:00
parent e98897e5dc
commit a3d6905053
8 changed files with 54 additions and 8 deletions

View file

@ -246,6 +246,9 @@ pub fn struct_lint_level<'s, 'd>(
let has_future_breakage =
future_incompatible.map_or(false, |incompat| incompat.future_breakage.is_some());
let is_force_warn = matches!(level, Level::ForceWarn)
|| matches!(src, LintLevelSource::CommandLine(_, Level::ForceWarn));
let mut err = match (level, span) {
(Level::Allow, span) => {
if has_future_breakage {
@ -254,6 +257,16 @@ pub fn struct_lint_level<'s, 'd>(
} else {
sess.struct_allow("")
}
} else if is_force_warn {
let mut err = if let Some(span) = span {
sess.struct_span_warn(span, "")
} else {
sess.struct_warn("")
};
// Ensure force-warn warns even if the diagnostic has
// been canceled for reasons like `--cap-lints`
err.level = rustc_errors::Level::Warning;
err
} else {
return;
}
@ -349,7 +362,7 @@ pub fn struct_lint_level<'s, 'd>(
}
}
err.code(DiagnosticId::Lint { name, has_future_breakage });
err.code(DiagnosticId::Lint { name, has_future_breakage, is_force_warn });
if let Some(future_incompatible) = future_incompatible {
let explanation = if lint_id == LintId::of(builtin::UNSTABLE_NAME_COLLISIONS) {