Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #88256 remove duplicated diagnostics #88493

Merged
merged 1 commit into from
Sep 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 48 additions & 1 deletion compiler/rustc_errors/src/diagnostic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ use rustc_lint_defs::Applicability;
use rustc_serialize::json::Json;
use rustc_span::{MultiSpan, Span, DUMMY_SP};
use std::fmt;
use std::hash::{Hash, Hasher};

#[must_use]
#[derive(Clone, Debug, PartialEq, Hash, Encodable, Decodable)]
#[derive(Clone, Debug, Encodable, Decodable)]
pub struct Diagnostic {
pub level: Level,
pub message: Vec<(String, Style)>,
Expand All @@ -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
/// `span` if there is one. Otherwise, it is `DUMMY_SP`.
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)]
Expand Down Expand Up @@ -91,6 +96,7 @@ impl Diagnostic {
children: vec![],
suggestions: vec![],
sort_span: DUMMY_SP,
is_lint: false,
}
}

Expand Down Expand Up @@ -558,6 +564,11 @@ impl Diagnostic {
self
}

pub fn set_is_lint(&mut self) -> &mut Self {
self.is_lint = true;
self
}

pub fn code(&mut self, s: DiagnosticId) -> &mut Self {
self.code = Some(s);
self
Expand Down Expand Up @@ -617,6 +628,42 @@ impl Diagnostic {
let sub = SubDiagnostic { level, message, span, render_span };
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 {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_errors/src/diagnostic_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ impl<'a> DiagnosticBuilder<'a> {
sp: S,
msg: &str,
) -> &mut Self);
forward!(pub fn set_is_lint(&mut self,) -> &mut Self);

/// See [`Diagnostic::multipart_suggestion()`].
pub fn multipart_suggestion(
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_middle/src/lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ impl<'a> LintDiagnosticBuilder<'a> {
/// Return the inner DiagnosticBuilder, first setting the primary message to `msg`.
pub fn build(mut self, msg: &str) -> DiagnosticBuilder<'a> {
self.0.set_primary_message(msg);
self.0.set_is_lint();
self.0
}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>

error: deny(unused) incompatible with previous forbid
--> $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>
estebank marked this conversation as resolved.
Show resolved Hide resolved

error: aborting due to 2 previous errors
error: aborting due to previous error

3 changes: 1 addition & 2 deletions src/test/ui/lint/outer-forbid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@
#![forbid(unused, non_snake_case)]
#![forbid(forbidden_lint_groups)]

#[allow(unused_variables)] //~ ERROR incompatible with previous
#[allow(unused_variables)]
//~^ ERROR incompatible with previous
//~| WARNING this was previously accepted by the compiler
//~| WARNING this was previously accepted by the compiler
fn foo() {}

#[allow(unused)] //~ ERROR incompatible with previous
Expand Down
18 changes: 3 additions & 15 deletions src/test/ui/lint/outer-forbid.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ LL | #![forbid(forbidden_lint_groups)]
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>

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)]
| ------ `forbid` level set here
Expand All @@ -28,26 +28,14 @@ LL | #[allow(unused)]
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>

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)]
| -------------- `forbid` level set here
...
LL | #[allow(nonstandard_style)]
| ^^^^^^^^^^^^^^^^^ overruled by previous forbid

error: allow(unused_variables) incompatible with previous forbid
--> $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>
estebank marked this conversation as resolved.
Show resolved Hide resolved

error: aborting due to 4 previous errors
error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0453`.
20 changes: 1 addition & 19 deletions src/tools/clippy/tests/ui/match_same_arms.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -106,24 +106,6 @@ LL | 1 => 2,
| ^
= 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
--> $DIR/match_same_arms.rs:50:55
|
Expand All @@ -142,5 +124,5 @@ LL | CommandInfo::BuiltIn { name, .. } => name.to_string(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: ...or consider changing the match arm bodies

error: aborting due to 8 previous errors
error: aborting due to 7 previous errors

8 changes: 1 addition & 7 deletions src/tools/clippy/tests/ui/modulo_one.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,6 @@ LL | const ONE: u32 = 1 * 1;
|
= 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
--> $DIR/modulo_one.rs:17:5
|
Expand All @@ -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
| ^^^^^^^^^^^^^^^^^

error: aborting due to 11 previous errors
error: aborting due to 10 previous errors

Original file line number Diff line number Diff line change
Expand Up @@ -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`

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
--> $DIR/suspicious_operation_groupings.rs:27:20
|
Expand Down Expand Up @@ -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 })
| ^^^^^^^^^^^^^ help: did you mean: `-s1.b < -s2.b`

error: aborting due to 27 previous errors
error: aborting due to 26 previous errors

1 change: 1 addition & 0 deletions src/tools/rustfmt/src/syntux/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ mod tests {
suggestions: vec![],
span: span.unwrap_or_else(MultiSpan::new),
sort_span: DUMMY_SP,
is_lint: false,
}
}

Expand Down