about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2016-10-26 21:03:18 -0700
committerZack M. Davis <code@zackmdavis.net>2016-10-26 22:42:20 -0700
commit8d1da8452cc725443c43c44e0f4ec64a73944cdf (patch)
tree347f6476a0142dc0b8a87fca88b1b1a44cf0636e
parent95805ee6275b4fe12cdb8845e699e7a6aa6b26eb (diff)
downloadrust-8d1da8452cc725443c43c44e0f4ec64a73944cdf.tar.gz
rust-8d1da8452cc725443c43c44e0f4ec64a73944cdf.zip
one-time diagnostics are only one-time for humans, not JSON-eating tools
Jonathan D. Turner pointed out that we don't want to dedup in JSON
mode. Since the compile-test runner uses JSON output, we regrettably
need to revert the edits to existing tests; one imagines that testing
for one-time diagnosticity for humans will have to be added as a UI
test.

This remains in the matter of #24690.
-rw-r--r--src/librustc/session/mod.rs20
-rw-r--r--src/test/compile-fail/lint-group-style.rs2
-rw-r--r--src/test/compile-fail/lint-unconditional-recursion.rs14
3 files changed, 30 insertions, 6 deletions
diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs
index f4029fde471..154fe9af79a 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -294,7 +294,8 @@ impl Session {
     }
 
     /// Analogous to calling `.span_note` on the given DiagnosticBuilder, but
-    /// deduplicates on span and message for this `Session`.
+    /// deduplicates on span and message for this `Session` if we're not
+    /// outputting in JSON mode.
     //
     // FIXME: if the need arises for one-time diagnostics other than
     // `span_note`, we almost certainly want to generalize this
@@ -303,10 +304,19 @@ impl Session {
     pub fn diag_span_note_once<'a, 'b>(&'a self,
                                        diag_builder: &'b mut DiagnosticBuilder<'a>,
                                        span: Span, message: &str) {
-        let span_message = (span, message.to_owned());
-        let fresh = self.one_time_diagnostics.borrow_mut().insert(span_message);
-        if fresh {
-            diag_builder.span_note(span, &message);
+        match self.opts.error_format {
+            // when outputting JSON for tool consumption, the tool might want
+            // the duplicates
+            config::ErrorOutputType::Json => {
+                diag_builder.span_note(span, &message);
+            },
+            _ => {
+                let span_message = (span, message.to_owned());
+                let fresh = self.one_time_diagnostics.borrow_mut().insert(span_message);
+                if fresh {
+                    diag_builder.span_note(span, &message);
+                }
+            }
         }
     }
 
diff --git a/src/test/compile-fail/lint-group-style.rs b/src/test/compile-fail/lint-group-style.rs
index a88e0c63ac3..393e46ab539 100644
--- a/src/test/compile-fail/lint-group-style.rs
+++ b/src/test/compile-fail/lint-group-style.rs
@@ -20,6 +20,7 @@ mod test {
 
     #[forbid(bad_style)]
     //~^ NOTE lint level defined here
+    //~^^ NOTE lint level defined here
     mod bad {
         fn CamelCase() {} //~ ERROR function `CamelCase` should have a snake case name
 
@@ -29,6 +30,7 @@ mod test {
     mod warn {
         #![warn(bad_style)]
         //~^ NOTE lint level defined here
+        //~| NOTE lint level defined here
 
         fn CamelCase() {} //~ WARN function `CamelCase` should have a snake case name
 
diff --git a/src/test/compile-fail/lint-unconditional-recursion.rs b/src/test/compile-fail/lint-unconditional-recursion.rs
index bee5a2c45be..94e189aa47f 100644
--- a/src/test/compile-fail/lint-unconditional-recursion.rs
+++ b/src/test/compile-fail/lint-unconditional-recursion.rs
@@ -10,7 +10,19 @@
 
 #![deny(unconditional_recursion)]
 //~^ NOTE lint level defined here
-
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
+//~| NOTE lint level defined here
 #![allow(dead_code)]
 fn foo() { //~ ERROR function cannot return without recurring
     foo(); //~ NOTE recursive call site