self.by_name.insert(name.into(), Removed(reason.into()));
}
- #[allow(unused_variables)]
- fn find_lint(&self, lint_name: &str, sess: &Session, span: Option<Span>)
- -> Result<LintId, FindLintError>
- {
+ fn find_lint(&self, lint_name: &str) -> Result<LintId, FindLintError> {
match self.by_name.get(lint_name) {
Some(&Id(lint_id)) => Ok(lint_id),
Some(&Renamed(_, lint_id)) => {
Ok(lint_id)
},
- Some(&Removed(ref reason)) => {
+ Some(&Removed(_)) => {
Err(FindLintError::Removed)
},
None => Err(FindLintError::NotFound)
&lint_name[..], level);
let lint_flag_val = Symbol::intern(&lint_name);
- match self.find_lint(&lint_name[..], sess, None) {
+ match self.find_lint(&lint_name[..]) {
Ok(lint_id) => self.levels.set(lint_id, (level, CommandLine(lint_flag_val))),
Err(FindLintError::Removed) => { }
Err(_) => {
let mut pushed = 0;
for result in gather_attrs(attrs) {
- let v = match result {
+ let (is_group, lint_level_spans) = match result {
Err(span) => {
span_err!(self.sess(), span, E0452,
"malformed lint attribute");
continue;
}
Ok((lint_name, level, span)) => {
- match self.lints().find_lint(&lint_name.as_str(), &self.sess(), Some(span)) {
- Ok(lint_id) => vec![(lint_id, level, span)],
+ match self.lints().find_lint(&lint_name.as_str()) {
+ Ok(lint_id) => (false, vec![(lint_id, level, span)]),
Err(FindLintError::NotFound) => {
match self.lints().lint_groups.get(&*lint_name.as_str()) {
- Some(&(ref v, _)) => v.iter()
+ Some(&(ref v, _)) => (true,
+ v.iter()
.map(|lint_id: &LintId|
(*lint_id, level, span))
- .collect(),
+ .collect()),
None => {
// The lint or lint group doesn't exist.
// This is an error, but it was handled
let lint_attr_name = result.expect("lint attribute should be well-formed").0;
- for (lint_id, level, span) in v {
+ for (lint_id, level, span) in lint_level_spans {
let (now, now_source) = self.lint_sess().get_source(lint_id);
if now == Forbid && level != Forbid {
- let lint_name = lint_id.to_string();
+ let forbidden_lint_name = match now_source {
+ LintSource::Default => lint_id.to_string(),
+ LintSource::Node(name, _) => name.to_string(),
+ LintSource::CommandLine(name) => name.to_string(),
+ };
let mut diag_builder = struct_span_err!(self.sess(), span, E0453,
"{}({}) overruled by outer forbid({})",
- level.as_str(), lint_name,
- lint_name);
+ level.as_str(), lint_attr_name,
+ forbidden_lint_name);
diag_builder.span_label(span, "overruled by previous forbid");
match now_source {
LintSource::Default => &mut diag_builder,
LintSource::CommandLine(_) => {
diag_builder.note("`forbid` lint level was set on command line")
}
- }.emit()
+ }.emit();
+ if is_group { // don't set a separate error for every lint in the group
+ break;
+ }
} else if now != level {
let cx = self.lint_sess_mut();
cx.stack.push((lint_id, (now, now_source)));
fn decode<D: Decoder>(d: &mut D) -> Result<LintId, D::Error> {
let s = d.read_str()?;
ty::tls::with(|tcx| {
- match tcx.sess.lint_store.borrow().find_lint(&s, tcx.sess, None) {
+ match tcx.sess.lint_store.borrow().find_lint(&s) {
Ok(id) => Ok(id),
Err(_) => panic!("invalid lint-id `{}`", s),
}