--cap-lints allow switches off can_emit_warnings

This boolean field on the error `Handler` is toggled to silence
warnings when `-A warnings` is passed. (This is actually a separate
mechanism from the global lint level—whether there's some redundancy
to be factored away here is an important question, but not one we
concern ourselves with in this commit.)  But the same rationale
applies for `--cap-lints allow`. In particular, this makes the "soft"
feature-gate warning introduced in 8492ad24 (which is not a lint, but
just calls `struct_span_warn`) not pollute the builds of dependent
crates.

Thanks to @kennytm for pointing out the potential of
`can_emit_warnings` for this purpose.

Resolves #44213.
This commit is contained in:
Zack M. Davis 2017-09-16 00:13:07 -07:00
parent fd4bef54ab
commit d02ceacb25
2 changed files with 29 additions and 3 deletions

View file

@ -660,12 +660,16 @@ pub fn build_session_with_codemap(sopts: config::Options,
// FIXME: This is not general enough to make the warning lint completely override
// normal diagnostic warnings, since the warning lint can also be denied and changed
// later via the source code.
let can_print_warnings = sopts.lint_opts
let warnings_allow = sopts.lint_opts
.iter()
.filter(|&&(ref key, _)| *key == "warnings")
.map(|&(_, ref level)| *level != lint::Allow)
.map(|&(_, ref level)| *level == lint::Allow)
.last()
.unwrap_or(true);
.unwrap_or(false);
let cap_lints_allow = sopts.lint_cap.map_or(false, |cap| cap == lint::Allow);
let can_print_warnings = !(warnings_allow || cap_lints_allow);
let treat_err_as_bug = sopts.debugging_opts.treat_err_as_bug;
let emitter: Box<Emitter> = match (sopts.error_format, emitter_dest) {

View file

@ -0,0 +1,22 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// compile-flags: --cap-lints allow
// This tests that the fn_must_use feature-gate warning respects the lint
// cap. (See discussion in Issue #44213.)
#![feature(rustc_attrs)]
#[must_use] // (no feature-gate warning because of the lint cap!)
fn need_to_use_it() -> bool { true }
#[rustc_error]
fn main() {} //~ ERROR compilation successful