Fix #88256, remove duplicated diagnostic

This commit is contained in:
yukang 2021-09-04 19:26:25 +08:00
parent 26feefddc7
commit ca27f03ca8
11 changed files with 59 additions and 65 deletions

View file

@ -9,9 +9,10 @@ use rustc_lint_defs::Applicability;
use rustc_serialize::json::Json; use rustc_serialize::json::Json;
use rustc_span::{MultiSpan, Span, DUMMY_SP}; use rustc_span::{MultiSpan, Span, DUMMY_SP};
use std::fmt; use std::fmt;
use std::hash::{Hash, Hasher};
#[must_use] #[must_use]
#[derive(Clone, Debug, PartialEq, Hash, Encodable, Decodable)] #[derive(Clone, Debug, Encodable, Decodable)]
pub struct Diagnostic { pub struct Diagnostic {
pub level: Level, pub level: Level,
pub message: Vec<(String, Style)>, pub message: Vec<(String, Style)>,
@ -24,6 +25,10 @@ pub struct Diagnostic {
/// as a sort key to sort a buffer of diagnostics. By default, it is the primary span of /// as a sort key to sort a buffer of diagnostics. By default, it is the primary span of
/// `span` if there is one. Otherwise, it is `DUMMY_SP`. /// `span` if there is one. Otherwise, it is `DUMMY_SP`.
pub sort_span: Span, pub sort_span: Span,
/// If diagnostic is from Lint, custom hash function ignores notes
/// otherwise hash is based on the all the fields
pub is_lint: bool,
} }
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)] #[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
@ -91,6 +96,7 @@ impl Diagnostic {
children: vec![], children: vec![],
suggestions: vec![], suggestions: vec![],
sort_span: DUMMY_SP, sort_span: DUMMY_SP,
is_lint: false,
} }
} }
@ -558,6 +564,11 @@ impl Diagnostic {
self self
} }
pub fn set_is_lint(&mut self) -> &mut Self {
self.is_lint = true;
self
}
pub fn code(&mut self, s: DiagnosticId) -> &mut Self { pub fn code(&mut self, s: DiagnosticId) -> &mut Self {
self.code = Some(s); self.code = Some(s);
self self
@ -617,6 +628,42 @@ impl Diagnostic {
let sub = SubDiagnostic { level, message, span, render_span }; let sub = SubDiagnostic { level, message, span, render_span };
self.children.push(sub); self.children.push(sub);
} }
/// Fields used for Hash, and PartialEq trait
fn keys(
&self,
) -> (
&Level,
&Vec<(String, Style)>,
&Option<DiagnosticId>,
&MultiSpan,
&Vec<CodeSuggestion>,
Option<&Vec<SubDiagnostic>>,
) {
(
&self.level,
&self.message,
&self.code,
&self.span,
&self.suggestions,
(if self.is_lint { None } else { Some(&self.children) }),
)
}
}
impl Hash for Diagnostic {
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
self.keys().hash(state);
}
}
impl PartialEq for Diagnostic {
fn eq(&self, other: &Self) -> bool {
self.keys() == other.keys()
}
} }
impl SubDiagnostic { impl SubDiagnostic {

View file

@ -242,6 +242,7 @@ impl<'a> DiagnosticBuilder<'a> {
sp: S, sp: S,
msg: &str, msg: &str,
) -> &mut Self); ) -> &mut Self);
forward!(pub fn set_is_lint(&mut self,) -> &mut Self);
/// See [`Diagnostic::multipart_suggestion()`]. /// See [`Diagnostic::multipart_suggestion()`].
pub fn multipart_suggestion( pub fn multipart_suggestion(

View file

@ -192,6 +192,7 @@ impl<'a> LintDiagnosticBuilder<'a> {
/// Return the inner DiagnosticBuilder, first setting the primary message to `msg`. /// Return the inner DiagnosticBuilder, first setting the primary message to `msg`.
pub fn build(mut self, msg: &str) -> DiagnosticBuilder<'a> { pub fn build(mut self, msg: &str) -> DiagnosticBuilder<'a> {
self.0.set_primary_message(msg); self.0.set_primary_message(msg);
self.0.set_is_lint();
self.0 self.0
} }

View file

@ -21,8 +21,6 @@ fn forbid_first(num: i32) -> i32 {
#![deny(unused)] #![deny(unused)]
//~^ ERROR: deny(unused) incompatible with previous forbid //~^ ERROR: deny(unused) incompatible with previous forbid
//~| WARNING being phased out //~| WARNING being phased out
//~| ERROR: deny(unused) incompatible with previous forbid
//~| WARNING being phased out
#![warn(unused)] #![warn(unused)]
#![allow(unused)] #![allow(unused)]

View file

@ -14,16 +14,5 @@ LL | #![forbid(forbidden_lint_groups)]
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670> = note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error: deny(unused) incompatible with previous forbid error: aborting due to previous error
--> $DIR/issue-70819-dont-override-forbid-in-same-scope.rs:21:13
|
LL | #![forbid(unused)]
| ------ `forbid` level set here
LL | #![deny(unused)]
| ^^^^^^ overruled by previous forbid
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error: aborting due to 2 previous errors

View file

@ -17,10 +17,9 @@
#![forbid(unused, non_snake_case)] #![forbid(unused, non_snake_case)]
#![forbid(forbidden_lint_groups)] #![forbid(forbidden_lint_groups)]
#[allow(unused_variables)] //~ ERROR incompatible with previous #[allow(unused_variables)]
//~^ ERROR incompatible with previous //~^ ERROR incompatible with previous
//~| WARNING this was previously accepted by the compiler //~| WARNING this was previously accepted by the compiler
//~| WARNING this was previously accepted by the compiler
fn foo() {} fn foo() {}
#[allow(unused)] //~ ERROR incompatible with previous #[allow(unused)] //~ ERROR incompatible with previous

View file

@ -16,7 +16,7 @@ LL | #![forbid(forbidden_lint_groups)]
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670> = note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error: allow(unused) incompatible with previous forbid error: allow(unused) incompatible with previous forbid
--> $DIR/outer-forbid.rs:26:9 --> $DIR/outer-forbid.rs:25:9
| |
LL | #![forbid(unused, non_snake_case)] LL | #![forbid(unused, non_snake_case)]
| ------ `forbid` level set here | ------ `forbid` level set here
@ -28,7 +28,7 @@ LL | #[allow(unused)]
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670> = note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error[E0453]: allow(nonstandard_style) incompatible with previous forbid error[E0453]: allow(nonstandard_style) incompatible with previous forbid
--> $DIR/outer-forbid.rs:30:9 --> $DIR/outer-forbid.rs:29:9
| |
LL | #![forbid(unused, non_snake_case)] LL | #![forbid(unused, non_snake_case)]
| -------------- `forbid` level set here | -------------- `forbid` level set here
@ -36,18 +36,6 @@ LL | #![forbid(unused, non_snake_case)]
LL | #[allow(nonstandard_style)] LL | #[allow(nonstandard_style)]
| ^^^^^^^^^^^^^^^^^ overruled by previous forbid | ^^^^^^^^^^^^^^^^^ overruled by previous forbid
error: allow(unused_variables) incompatible with previous forbid error: aborting due to 3 previous errors
--> $DIR/outer-forbid.rs:20:9
|
LL | #![forbid(unused, non_snake_case)]
| ------ `forbid` level set here
...
LL | #[allow(unused_variables)]
| ^^^^^^^^^^^^^^^^ overruled by previous forbid
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0453`. For more information about this error, try `rustc --explain E0453`.

View file

@ -106,24 +106,6 @@ LL | 1 => 2,
| ^ | ^
= help: ...or consider changing the match arm bodies = help: ...or consider changing the match arm bodies
error: this `match` has identical arm bodies
--> $DIR/match_same_arms.rs:33:14
|
LL | 3 => 2, //~ ERROR 3rd matched arms have same body
| ^
|
note: same as this
--> $DIR/match_same_arms.rs:32:14
|
LL | 2 => 2, //~ ERROR 2nd matched arms have same body
| ^
help: consider refactoring into `2 | 3`
--> $DIR/match_same_arms.rs:32:9
|
LL | 2 => 2, //~ ERROR 2nd matched arms have same body
| ^
= help: ...or consider changing the match arm bodies
error: this `match` has identical arm bodies error: this `match` has identical arm bodies
--> $DIR/match_same_arms.rs:50:55 --> $DIR/match_same_arms.rs:50:55
| |
@ -142,5 +124,5 @@ LL | CommandInfo::BuiltIn { name, .. } => name.to_string(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: ...or consider changing the match arm bodies = help: ...or consider changing the match arm bodies
error: aborting due to 8 previous errors error: aborting due to 7 previous errors

View file

@ -46,12 +46,6 @@ LL | const ONE: u32 = 1 * 1;
| |
= note: `-D clippy::identity-op` implied by `-D warnings` = note: `-D clippy::identity-op` implied by `-D warnings`
error: the operation is ineffective. Consider reducing it to `1`
--> $DIR/modulo_one.rs:13:22
|
LL | const ONE: u32 = 1 * 1;
| ^^^^^
error: any number modulo 1 will be 0 error: any number modulo 1 will be 0
--> $DIR/modulo_one.rs:17:5 --> $DIR/modulo_one.rs:17:5
| |
@ -70,5 +64,5 @@ error: any number modulo -1 will panic/overflow or result in 0
LL | INT_MIN % NEG_ONE; // also caught by rustc LL | INT_MIN % NEG_ONE; // also caught by rustc
| ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
error: aborting due to 11 previous errors error: aborting due to 10 previous errors

View file

@ -6,12 +6,6 @@ LL | self.x == other.y && self.y == other.y && self.z == other.z
| |
= note: `-D clippy::suspicious-operation-groupings` implied by `-D warnings` = note: `-D clippy::suspicious-operation-groupings` implied by `-D warnings`
error: this sequence of operators looks suspiciously like a bug
--> $DIR/suspicious_operation_groupings.rs:14:9
|
LL | self.x == other.y && self.y == other.y && self.z == other.z
| ^^^^^^^^^^^^^^^^^ help: did you mean: `self.x == other.x`
error: this sequence of operators looks suspiciously like a bug error: this sequence of operators looks suspiciously like a bug
--> $DIR/suspicious_operation_groupings.rs:27:20 --> $DIR/suspicious_operation_groupings.rs:27:20
| |
@ -162,5 +156,5 @@ error: this sequence of operators looks suspiciously like a bug
LL | -(if -s1.a < -s2.a && -s1.a < -s2.b { s1.c } else { s2.a }) LL | -(if -s1.a < -s2.a && -s1.a < -s2.b { s1.c } else { s2.a })
| ^^^^^^^^^^^^^ help: did you mean: `-s1.b < -s2.b` | ^^^^^^^^^^^^^ help: did you mean: `-s1.b < -s2.b`
error: aborting due to 27 previous errors error: aborting due to 26 previous errors

View file

@ -311,6 +311,7 @@ mod tests {
suggestions: vec![], suggestions: vec![],
span: span.unwrap_or_else(MultiSpan::new), span: span.unwrap_or_else(MultiSpan::new),
sort_span: DUMMY_SP, sort_span: DUMMY_SP,
is_lint: false,
} }
} }