Skip to content

Commit 3dd73b0

Browse files
committed
only emit "lint level defined here" the first time
We introduce a new `one_time_diagnostics` field on `rustc::session::Session` to hold a hashset of diagnostic messages we've set once but don't want to see again (as uniquified by span and message text), "lint level defined here" being the motivating example dealt with here. It is the responsibility of the caller setting a diagnostic to decide whether to add to `one_time_diagnostics`; there are other situations where we likely do want it to be possible for a note to appear twice on the same span with the same message (e.g., "prior assignment occurs here"). This is in the matter of rust-lang#24690.
1 parent 382ab92 commit 3dd73b0

File tree

5 files changed

+14
-18
lines changed

5 files changed

+14
-18
lines changed

src/librustc/lint/context.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,13 @@ pub fn raw_struct_lint<'a>(sess: &'a Session,
462462

463463
if let Some(span) = def {
464464
let explanation = "lint level defined here";
465-
err.span_note(span, &explanation);
465+
let span_explanation = (span, explanation.to_owned());
466+
let already_noted: bool = sess.one_time_diagnostics.borrow()
467+
.contains(&span_explanation);
468+
if !already_noted {
469+
err.span_note(span, explanation);
470+
sess.one_time_diagnostics.borrow_mut().insert(span_explanation);
471+
}
466472
}
467473

468474
err

src/librustc/session/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use middle::dependency_format;
1717
use session::search_paths::PathKind;
1818
use session::config::{DebugInfoLevel, PanicStrategy};
1919
use ty::tls;
20-
use util::nodemap::{NodeMap, FnvHashMap};
20+
use util::nodemap::{NodeMap, FnvHashMap, FnvHashSet};
2121
use mir::transform as mir_pass;
2222

2323
use syntax::ast::{NodeId, NodeIdAssigner, Name};
@@ -70,6 +70,10 @@ pub struct Session {
7070
pub working_dir: PathBuf,
7171
pub lint_store: RefCell<lint::LintStore>,
7272
pub lints: RefCell<NodeMap<Vec<(lint::LintId, Span, String)>>>,
73+
/// Set of (span, message) tuples tracking lint (sub)diagnostics that have
74+
/// been set once, but should not be set again, in order to avoid
75+
/// redundantly verbose output.
76+
pub one_time_diagnostics: RefCell<FnvHashSet<(Span, String)>>,
7377
pub plugin_llvm_passes: RefCell<Vec<String>>,
7478
pub mir_passes: RefCell<mir_pass::Passes>,
7579
pub plugin_attributes: RefCell<Vec<(String, AttributeType)>>,
@@ -523,6 +527,7 @@ pub fn build_session_(sopts: config::Options,
523527
working_dir: env::current_dir().unwrap(),
524528
lint_store: RefCell::new(lint::LintStore::new()),
525529
lints: RefCell::new(NodeMap()),
530+
one_time_diagnostics: RefCell::new(FnvHashSet()),
526531
plugin_llvm_passes: RefCell::new(Vec::new()),
527532
mir_passes: RefCell::new(mir_pass::Passes::new()),
528533
plugin_attributes: RefCell::new(Vec::new()),

src/test/compile-fail/lint-group-style.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ mod test {
2020

2121
#[forbid(bad_style)]
2222
//~^ NOTE lint level defined here
23-
//~^^ NOTE lint level defined here
2423
mod bad {
2524
fn CamelCase() {} //~ ERROR function `CamelCase` should have a snake case name
2625

@@ -30,7 +29,6 @@ mod test {
3029
mod warn {
3130
#![warn(bad_style)]
3231
//~^ NOTE lint level defined here
33-
//~| NOTE lint level defined here
3432

3533
fn CamelCase() {} //~ WARN function `CamelCase` should have a snake case name
3634

src/test/compile-fail/lint-no-drop-on-repr-extern.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#![feature(unsafe_no_drop_flag)]
1717
#![deny(drop_with_repr_extern)]
1818
//~^ NOTE lint level defined here
19-
//~| NOTE lint level defined here
2019

2120
#[repr(C)] struct As { x: Box<i8> }
2221
#[repr(C)] enum Ae { Ae(Box<i8>), _None }

src/test/compile-fail/lint-unconditional-recursion.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,7 @@
1010

1111
#![deny(unconditional_recursion)]
1212
//~^ NOTE lint level defined here
13-
//~| NOTE lint level defined here
14-
//~| NOTE lint level defined here
15-
//~| NOTE lint level defined here
16-
//~| NOTE lint level defined here
17-
//~| NOTE lint level defined here
18-
//~| NOTE lint level defined here
19-
//~| NOTE lint level defined here
20-
//~| NOTE lint level defined here
21-
//~| NOTE lint level defined here
22-
//~| NOTE lint level defined here
23-
//~| NOTE lint level defined here
24-
//~| NOTE lint level defined here
25-
//~| NOTE lint level defined here
13+
2614
#![allow(dead_code)]
2715
fn foo() { //~ ERROR function cannot return without recurring
2816
foo(); //~ NOTE recursive call site

0 commit comments

Comments
 (0)