Report fatal lexer errors in --cfg command line arguments

This commit is contained in:
Fabian Wolff 2021-10-02 19:15:45 +02:00
parent ed937594d3
commit 041212f8fb
5 changed files with 37 additions and 7 deletions

View file

@ -15,7 +15,7 @@ use rustc_span::{MultiSpan, SourceFile, Span};
use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, Style, StyledString}; use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, Style, StyledString};
use crate::styled_buffer::StyledBuffer; use crate::styled_buffer::StyledBuffer;
use crate::{ use crate::{
CodeSuggestion, Diagnostic, DiagnosticId, Level, SubDiagnostic, SubstitutionHighlight, CodeSuggestion, Diagnostic, DiagnosticId, Handler, Level, SubDiagnostic, SubstitutionHighlight,
SuggestionStyle, SuggestionStyle,
}; };
@ -527,14 +527,27 @@ impl Emitter for EmitterWriter {
} }
} }
/// An emitter that does nothing when emitting a diagnostic. /// An emitter that does nothing when emitting a non-fatal diagnostic.
pub struct SilentEmitter; /// Fatal diagnostics are forwarded to `fatal_handler` to avoid silent
/// failures of rustc, as witnessed e.g. in issue #89358.
pub struct SilentEmitter {
pub fatal_handler: Handler,
pub fatal_note: Option<String>,
}
impl Emitter for SilentEmitter { impl Emitter for SilentEmitter {
fn source_map(&self) -> Option<&Lrc<SourceMap>> { fn source_map(&self) -> Option<&Lrc<SourceMap>> {
None None
} }
fn emit_diagnostic(&mut self, _: &Diagnostic) {} fn emit_diagnostic(&mut self, d: &Diagnostic) {
if d.level == Level::Fatal {
let mut d = d.clone();
if let Some(ref note) = self.fatal_note {
d.note(note);
}
self.fatal_handler.emit_diagnostic(&d);
}
}
} }
/// Maximum number of lines we will print for a multiline suggestion; arbitrary. /// Maximum number of lines we will print for a multiline suggestion; arbitrary.

View file

@ -81,7 +81,10 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> FxHashSet<(String, Option<String
let cfg = cfgspecs let cfg = cfgspecs
.into_iter() .into_iter()
.map(|s| { .map(|s| {
let sess = ParseSess::with_silent_emitter(); let sess = ParseSess::with_silent_emitter(Some(format!(
"this error occurred on the command line: `--cfg={}`",
s
)));
let filename = FileName::cfg_spec_source_code(&s); let filename = FileName::cfg_spec_source_code(&s);
let mut parser = new_parser_from_source_str(&sess, filename, s.to_string()); let mut parser = new_parser_from_source_str(&sess, filename, s.to_string());

View file

@ -174,9 +174,14 @@ impl ParseSess {
} }
} }
pub fn with_silent_emitter() -> Self { pub fn with_silent_emitter(fatal_note: Option<String>) -> Self {
let sm = Lrc::new(SourceMap::new(FilePathMapping::empty())); let sm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
let handler = Handler::with_emitter(false, None, Box::new(SilentEmitter)); let fatal_handler = Handler::with_tty_emitter(ColorConfig::Auto, false, None, None);
let handler = Handler::with_emitter(
false,
None,
Box::new(SilentEmitter { fatal_handler, fatal_note }),
);
ParseSess::with_span_handler(handler, sm) ParseSess::with_span_handler(handler, sm)
} }

View file

@ -0,0 +1,5 @@
// Regression test for issue #89358.
// compile-flags: --cfg a"
// error-pattern: unterminated double quote string
// error-pattern: this error occurred on the command line

View file

@ -0,0 +1,4 @@
error[E0765]: unterminated double quote string
|
= note: this error occurred on the command line: `--cfg=a"`