diff options
| author | Ryan Levick <me@ryanlevick.com> | 2021-07-01 12:29:20 +0200 |
|---|---|---|
| committer | Ryan Levick <me@ryanlevick.com> | 2021-07-01 12:29:20 +0200 |
| commit | 33cc7b1fe21c82d31204e549cd2471ac8ec22aa3 (patch) | |
| tree | 6f60870bfaaaa7c5377f11f33b0dc9b84d9bda46 /compiler | |
| parent | a3d6905053ad60e836717976e6e4d38de67888f9 (diff) | |
| download | rust-33cc7b1fe21c82d31204e549cd2471ac8ec22aa3.tar.gz rust-33cc7b1fe21c82d31204e549cd2471ac8ec22aa3.zip | |
New force_warn diagnostic builder and ensure cap-lints doesn't reduce force_warn level
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_errors/src/lib.rs | 18 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/lint.rs | 25 | ||||
| -rw-r--r-- | compiler/rustc_session/src/session.rs | 10 |
3 files changed, 39 insertions, 14 deletions
diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index c5399282a1e..a5e11541c8b 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -521,12 +521,24 @@ impl Handler { } /// Construct a builder at the `Warning` level at the given `span` and with the `msg`. + /// Cancel the builder if warnings cannot be emitted pub fn struct_span_warn(&self, span: impl Into<MultiSpan>, msg: &str) -> DiagnosticBuilder<'_> { let mut result = self.struct_warn(msg); result.set_span(span); result } + /// Construct a builder at the `Warning` level at the given `span` and with the `msg`. + pub fn struct_span_force_warn( + &self, + span: impl Into<MultiSpan>, + msg: &str, + ) -> DiagnosticBuilder<'_> { + let mut result = self.struct_force_warn(msg); + result.set_span(span); + result + } + /// Construct a builder at the `Allow` level at the given `span` and with the `msg`. pub fn struct_span_allow( &self, @@ -552,6 +564,7 @@ impl Handler { } /// Construct a builder at the `Warning` level with the `msg`. + /// Cancel the builder if warnings cannot be emitted pub fn struct_warn(&self, msg: &str) -> DiagnosticBuilder<'_> { let mut result = DiagnosticBuilder::new(self, Level::Warning, msg); if !self.flags.can_emit_warnings { @@ -560,6 +573,11 @@ impl Handler { result } + /// Construct a builder at the `Warning` level with the `msg`. + pub fn struct_force_warn(&self, msg: &str) -> DiagnosticBuilder<'_> { + DiagnosticBuilder::new(self, Level::Warning, msg) + } + /// Construct a builder at the `Allow` level with the `msg`. pub fn struct_allow(&self, msg: &str) -> DiagnosticBuilder<'_> { DiagnosticBuilder::new(self, Level::Allow, msg) diff --git a/compiler/rustc_middle/src/lint.rs b/compiler/rustc_middle/src/lint.rs index 71cf5b2249c..b5eab8be17f 100644 --- a/compiler/rustc_middle/src/lint.rs +++ b/compiler/rustc_middle/src/lint.rs @@ -108,8 +108,13 @@ impl LintLevelSets { } } - // Ensure that we never exceed the `--cap-lints` argument. - level = cmp::min(level, self.lint_cap); + // Ensure that we never exceed the `--cap-lints` argument + // unless the source is a --force-warn + level = if let LintLevelSource::CommandLine(_, Level::ForceWarn) = src { + level + } else { + cmp::min(level, self.lint_cap) + }; if let Some(driver_level) = sess.driver_lint_caps.get(&LintId::of(lint)) { // Ensure that we never exceed driver level. @@ -257,22 +262,14 @@ 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; } } - (Level::Warn | Level::ForceWarn, Some(span)) => sess.struct_span_warn(span, ""), - (Level::Warn | Level::ForceWarn, None) => sess.struct_warn(""), + (Level::Warn, Some(span)) => sess.struct_span_warn(span, ""), + (Level::Warn, None) => sess.struct_warn(""), + (Level::ForceWarn, Some(span)) => sess.struct_span_force_warn(span, ""), + (Level::ForceWarn, None) => sess.struct_force_warn(""), (Level::Deny | Level::Forbid, Some(span)) => sess.struct_span_err(span, ""), (Level::Deny | Level::Forbid, None) => sess.struct_err(""), }; diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 2bcb7c94d53..f6b7797c2e3 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -369,6 +369,13 @@ impl Session { pub fn struct_span_warn<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> DiagnosticBuilder<'_> { self.diagnostic().struct_span_warn(sp, msg) } + pub fn struct_span_force_warn<S: Into<MultiSpan>>( + &self, + sp: S, + msg: &str, + ) -> DiagnosticBuilder<'_> { + self.diagnostic().struct_span_force_warn(sp, msg) + } pub fn struct_span_warn_with_code<S: Into<MultiSpan>>( &self, sp: S, @@ -380,6 +387,9 @@ impl Session { pub fn struct_warn(&self, msg: &str) -> DiagnosticBuilder<'_> { self.diagnostic().struct_warn(msg) } + pub fn struct_force_warn(&self, msg: &str) -> DiagnosticBuilder<'_> { + self.diagnostic().struct_force_warn(msg) + } pub fn struct_span_allow<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> DiagnosticBuilder<'_> { self.diagnostic().struct_span_allow(sp, msg) } |
