]> git.lizzy.rs Git - rust.git/commitdiff
Auto merge of #88493 - chenyukang:fix-duplicated-diagnostic, r=estebank
authorbors <bors@rust-lang.org>
Mon, 6 Sep 2021 00:14:41 +0000 (00:14 +0000)
committerbors <bors@rust-lang.org>
Mon, 6 Sep 2021 00:14:41 +0000 (00:14 +0000)
Fix #88256 remove duplicated diagnostics

Fix #88256

compiler/rustc_errors/src/diagnostic.rs
compiler/rustc_errors/src/diagnostic_builder.rs
compiler/rustc_middle/src/lint.rs
src/test/ui/lint/issue-70819-dont-override-forbid-in-same-scope.rs
src/test/ui/lint/issue-70819-dont-override-forbid-in-same-scope.stderr
src/test/ui/lint/outer-forbid.rs
src/test/ui/lint/outer-forbid.stderr
src/tools/clippy/tests/ui/match_same_arms.stderr
src/tools/clippy/tests/ui/modulo_one.stderr
src/tools/clippy/tests/ui/suspicious_operation_groupings.stderr
src/tools/rustfmt/src/syntux/session.rs

index 8199c44ee2aed21f64697b757d9ac8a560b7eb98..550c1c43530df6090c08f33d5f711f213e641c21 100644 (file)
@@ -9,9 +9,10 @@
 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)>,
@@ -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)]
@@ -91,6 +96,7 @@ pub fn new_with_code(level: Level, code: Option<DiagnosticId>, message: &str) ->
             children: vec![],
             suggestions: vec![],
             sort_span: DUMMY_SP,
+            is_lint: false,
         }
     }
 
@@ -558,6 +564,11 @@ pub fn set_span<S: Into<MultiSpan>>(&mut self, sp: S) -> &mut 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 {
         self.code = Some(s);
         self
@@ -617,6 +628,42 @@ fn sub_with_highlights(
         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 {
index d35b29248033fd75ac3dd6bc4b59f7fad2fe0dd1..c498ce7dbe426aaed3a4396265d9fa61cd3255b5 100644 (file)
@@ -242,6 +242,7 @@ pub fn span_labels(
         sp: S,
         msg: &str,
     ) -> &mut Self);
+    forward!(pub fn set_is_lint(&mut self,) -> &mut Self);
 
     /// See [`Diagnostic::multipart_suggestion()`].
     pub fn multipart_suggestion(
index 6ad68877235dc7d6453c65be964d44e5b278f05a..60cb78d902ee60f9dd49c6dab680907be6f2c758 100644 (file)
@@ -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
     }
 
index 05d7d924c8fabe0aa762309665c09358d27db06f..c66037e9a73ae6d01acbe5e466208575ff956df7 100644 (file)
@@ -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)]
 
index 475410cecffa30b105a618f9924fa93ef502bb62..5093715decfc1925e96768f19644de41d785fe20 100644 (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!
    = 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>
-
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
index 486ec3c46804fb0f0d01f760baa7c4c4b5cdfaa7..ba330258d111fff04c092114e60f2c60dde5c321 100644 (file)
 #![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
index d69157a8bb3adc9d316d331c3810bc4348702c26..7814573210548e291b541a967bd2097625438b21 100644 (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>
 
 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
@@ -28,7 +28,7 @@ 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
@@ -36,18 +36,6 @@ LL | #![forbid(unused, non_snake_case)]
 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>
-
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0453`.
index e48451acfe8f5f4c67f76c65298e40b9a463e9f5..7752a8a6ff2b4094a3089d3295d77b4d2a44f597 100644 (file)
@@ -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
    |
@@ -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
 
index 2b2c699733852dd464507708dc41ad79a15b92eb..34f762bbb923648996cb56af20e84dba18b4fb47 100644 (file)
@@ -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
    |
@@ -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
 
index 96065699d321a057f9a8e28bf07ad3e4551ee282..dd6f2f6641d678b14b1d401fac951d98ce43f913 100644 (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`
 
-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
    |
@@ -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
 
index 870f0acfe395c527bd0e0a6fee9c833073e766ba..2965b0928aadaf751663bad5017ecfbf93101057 100644 (file)
@@ -311,6 +311,7 @@ fn build_diagnostic(level: DiagnosticLevel, span: Option<MultiSpan>) -> Diagnost
                 suggestions: vec![],
                 span: span.unwrap_or_else(MultiSpan::new),
                 sort_span: DUMMY_SP,
+                is_lint: false,
             }
         }