Add -Z dont-buffer-diagnostics, a way to force NLL to immediately emit its diagnostics.
This is mainly intended for `rustc` developers who want to see a diagnostic in its original context in the control flow. Two uses cases for that are: * `-Z treat-err-as-bug` which then allows extraction of a stack-trace to the origin of the error (a case that is so important that we make that flag imply this one, effectively). * `RUST_LOG=... rustc`, in which case it is often useful to see the logging statements that occurred immediately prior to the point where the diagnostic was signalled. Drive-by: Added some documentation pointing future devs at HandlerFlags, and documented the fields of `HandlerFlags` itself.
This commit is contained in:
parent
f789b6bd6d
commit
82e1750414
@ -1331,6 +1331,8 @@ fn parse_cross_lang_lto(slot: &mut CrossLangLto, v: Option<&str>) -> bool {
|
|||||||
"disable user provided type assertion in NLL"),
|
"disable user provided type assertion in NLL"),
|
||||||
nll_dont_emit_read_for_match: bool = (false, parse_bool, [UNTRACKED],
|
nll_dont_emit_read_for_match: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"in match codegen, do not include ReadForMatch statements (used by mir-borrowck)"),
|
"in match codegen, do not include ReadForMatch statements (used by mir-borrowck)"),
|
||||||
|
dont_buffer_diagnostics: bool = (false, parse_bool, [UNTRACKED],
|
||||||
|
"emit diagnostics rather than buffering (breaks NLL error downgrading, sorting)."),
|
||||||
polonius: bool = (false, parse_bool, [UNTRACKED],
|
polonius: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"enable polonius-based borrow-checker"),
|
"enable polonius-based borrow-checker"),
|
||||||
codegen_time_graph: bool = (false, parse_bool, [UNTRACKED],
|
codegen_time_graph: bool = (false, parse_bool, [UNTRACKED],
|
||||||
|
@ -1012,6 +1012,7 @@ pub fn build_session_with_source_map(
|
|||||||
let can_emit_warnings = !(warnings_allow || cap_lints_allow);
|
let can_emit_warnings = !(warnings_allow || cap_lints_allow);
|
||||||
|
|
||||||
let treat_err_as_bug = sopts.debugging_opts.treat_err_as_bug;
|
let treat_err_as_bug = sopts.debugging_opts.treat_err_as_bug;
|
||||||
|
let dont_buffer_diagnostics = sopts.debugging_opts.dont_buffer_diagnostics;
|
||||||
let report_delayed_bugs = sopts.debugging_opts.report_delayed_bugs;
|
let report_delayed_bugs = sopts.debugging_opts.report_delayed_bugs;
|
||||||
|
|
||||||
let external_macro_backtrace = sopts.debugging_opts.external_macro_backtrace;
|
let external_macro_backtrace = sopts.debugging_opts.external_macro_backtrace;
|
||||||
@ -1059,6 +1060,7 @@ pub fn build_session_with_source_map(
|
|||||||
can_emit_warnings,
|
can_emit_warnings,
|
||||||
treat_err_as_bug,
|
treat_err_as_bug,
|
||||||
report_delayed_bugs,
|
report_delayed_bugs,
|
||||||
|
dont_buffer_diagnostics,
|
||||||
external_macro_backtrace,
|
external_macro_backtrace,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
use syntax_pos::{MultiSpan, Span};
|
use syntax_pos::{MultiSpan, Span};
|
||||||
|
|
||||||
/// Used for emitting structured error messages and other diagnostic information.
|
/// Used for emitting structured error messages and other diagnostic information.
|
||||||
|
///
|
||||||
|
/// If there is some state in a downstream crate you would like to
|
||||||
|
/// access in the methods of `DiagnosticBuilder` here, consider
|
||||||
|
/// extending `HandlerFlags`, accessed via `self.handler.flags`.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct DiagnosticBuilder<'a> {
|
pub struct DiagnosticBuilder<'a> {
|
||||||
@ -89,8 +93,14 @@ pub fn emit(&mut self) {
|
|||||||
self.cancel();
|
self.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Buffers the diagnostic for later emission.
|
/// Buffers the diagnostic for later emission, unless handler
|
||||||
pub fn buffer(self, buffered_diagnostics: &mut Vec<Diagnostic>) {
|
/// has disabled such buffering.
|
||||||
|
pub fn buffer(mut self, buffered_diagnostics: &mut Vec<Diagnostic>) {
|
||||||
|
if self.handler.flags.dont_buffer_diagnostics || self.handler.flags.treat_err_as_bug {
|
||||||
|
self.emit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// We need to use `ptr::read` because `DiagnosticBuilder`
|
// We need to use `ptr::read` because `DiagnosticBuilder`
|
||||||
// implements `Drop`.
|
// implements `Drop`.
|
||||||
let diagnostic;
|
let diagnostic;
|
||||||
|
@ -303,9 +303,20 @@ fn default_track_diagnostic(_: &Diagnostic) {}
|
|||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct HandlerFlags {
|
pub struct HandlerFlags {
|
||||||
|
/// If false, warning-level lints are suppressed.
|
||||||
|
/// (rustc: see `--allow warnings` and `--cap-lints`)
|
||||||
pub can_emit_warnings: bool,
|
pub can_emit_warnings: bool,
|
||||||
|
/// If true, error-level diagnostics are upgraded to bug-level.
|
||||||
|
/// (rustc: see `-Z treat-err-as-bug`)
|
||||||
pub treat_err_as_bug: bool,
|
pub treat_err_as_bug: bool,
|
||||||
|
/// If true, immediately emit diagnostics that would otherwise be buffered.
|
||||||
|
/// (rustc: see `-Z dont-buffer-diagnostics` and `-Z treat-err-as-bug`)
|
||||||
|
pub dont_buffer_diagnostics: bool,
|
||||||
|
/// If true, immediately print bugs registered with `delay_span_bug`.
|
||||||
|
/// (rustc: see `-Z report-delayed-bugs`)
|
||||||
pub report_delayed_bugs: bool,
|
pub report_delayed_bugs: bool,
|
||||||
|
/// show macro backtraces even for non-local macros.
|
||||||
|
/// (rustc: see `-Z external-macro-backtrace`)
|
||||||
pub external_macro_backtrace: bool,
|
pub external_macro_backtrace: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user