Skip to content

Commit 379ac50

Browse files
authored
Auto merge of #34251 - zackmdavis:forbidden_on_whose_authority, r=Manishearth
diagnostically note source of overruling outer forbid When we emit E0453 (lint level attribute overruled by outer `forbid` lint level), it could be helpful to note where the `forbid` level was set, for the convenience of users who, e.g., believe that the correct fix is to weaken the `forbid` to `deny`. ![forbidden_on_whose_authority](https://cloud.githubusercontent.com/assets/1076988/15995312/2d847376-30ce-11e6-865e-b68cfebc0291.png)
2 parents 5556554 + 661b4f0 commit 379ac50

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

src/librustc/lint/context.rs

+16-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use dep_graph::DepNode;
2929
use middle::privacy::AccessLevels;
3030
use ty::TyCtxt;
3131
use session::{config, early_error, Session};
32-
use lint::{Level, LevelSource, Lint, LintId, LintPass};
32+
use lint::{Level, LevelSource, Lint, LintId, LintPass, LintSource};
3333
use lint::{EarlyLintPassObject, LateLintPassObject};
3434
use lint::{Default, CommandLine, Node, Allow, Warn, Deny, Forbid};
3535
use lint::builtin;
@@ -599,13 +599,23 @@ pub trait LintContext: Sized {
599599
};
600600

601601
for (lint_id, level, span) in v {
602-
let now = self.lints().get_level_source(lint_id).0;
602+
let (now, now_source) = self.lints().get_level_source(lint_id);
603603
if now == Forbid && level != Forbid {
604604
let lint_name = lint_id.as_str();
605-
span_err!(self.sess(), span, E0453,
606-
"{}({}) overruled by outer forbid({})",
607-
level.as_str(), lint_name,
608-
lint_name);
605+
let mut diag_builder = struct_span_err!(self.sess(), span, E0453,
606+
"{}({}) overruled by outer forbid({})",
607+
level.as_str(), lint_name,
608+
lint_name);
609+
match now_source {
610+
LintSource::Default => &mut diag_builder,
611+
LintSource::Node(forbid_source_span) => {
612+
diag_builder.span_note(forbid_source_span,
613+
"`forbid` lint level set here")
614+
},
615+
LintSource::CommandLine => {
616+
diag_builder.note("`forbid` lint level was set on command line")
617+
}
618+
}.emit()
609619
} else if now != level {
610620
let src = self.lints().get_level_source(lint_id).1;
611621
self.level_stack().push((lint_id, (now, src)));

src/test/compile-fail-fulldeps/lint-plugin-forbid-attrs.rs

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#![feature(plugin)]
1515
#![plugin(lint_plugin_test)]
1616
#![forbid(test_lint)]
17+
//~^ NOTE lint level defined here
18+
//~| NOTE `forbid` lint level set here
1719

1820
fn lintme() { } //~ ERROR item is named 'lintme'
1921

src/test/compile-fail/lint-forbid-attr.rs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// except according to those terms.
1010

1111
#![forbid(deprecated)]
12+
//~^ NOTE `forbid` lint level set here
1213

1314
#[allow(deprecated)] //~ ERROR allow(deprecated) overruled by outer forbid(deprecated)
1415
fn main() {

0 commit comments

Comments
 (0)