Emit an error for --cfg=)
Fixes #73026 See also: #64467, #89468 The issue stems from a `FatalError` being silently raised in `panictry_buffer`. Normally this is not a problem, because `panictry_buffer` emits the causes of the error, but they are not themselves fatal, so they get filtered out by the silent emitter. To fix this, we use a parser entrypoint which doesn't use `panictry_buffer`, and we handle the error ourselves.
This commit is contained in:
parent
8ed935e92d
commit
193342eb8d
@ -11,7 +11,7 @@
|
||||
use rustc_errors::{ErrorReported, Handler};
|
||||
use rustc_lint::LintStore;
|
||||
use rustc_middle::ty;
|
||||
use rustc_parse::new_parser_from_source_str;
|
||||
use rustc_parse::maybe_new_parser_from_source_str;
|
||||
use rustc_query_impl::QueryCtxt;
|
||||
use rustc_session::config::{self, ErrorOutputType, Input, OutputFilenames};
|
||||
use rustc_session::early_error;
|
||||
@ -91,7 +91,6 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> FxHashSet<(String, Option<String
|
||||
s
|
||||
)));
|
||||
let filename = FileName::cfg_spec_source_code(&s);
|
||||
let mut parser = new_parser_from_source_str(&sess, filename, s.to_string());
|
||||
|
||||
macro_rules! error {
|
||||
($reason: expr) => {
|
||||
@ -102,26 +101,27 @@ macro_rules! error {
|
||||
};
|
||||
}
|
||||
|
||||
match &mut parser.parse_meta_item() {
|
||||
Ok(meta_item) if parser.token == token::Eof => {
|
||||
if meta_item.path.segments.len() != 1 {
|
||||
error!("argument key must be an identifier");
|
||||
}
|
||||
match &meta_item.kind {
|
||||
MetaItemKind::List(..) => {
|
||||
error!(r#"expected `key` or `key="value"`"#);
|
||||
match maybe_new_parser_from_source_str(&sess, filename, s.to_string()) {
|
||||
Ok(mut parser) => match &mut parser.parse_meta_item() {
|
||||
Ok(meta_item) if parser.token == token::Eof => {
|
||||
if meta_item.path.segments.len() != 1 {
|
||||
error!("argument key must be an identifier");
|
||||
}
|
||||
MetaItemKind::NameValue(lit) if !lit.kind.is_str() => {
|
||||
error!("argument value must be a string");
|
||||
}
|
||||
MetaItemKind::NameValue(..) | MetaItemKind::Word => {
|
||||
let ident = meta_item.ident().expect("multi-segment cfg key");
|
||||
return (ident.name, meta_item.value_str());
|
||||
match &meta_item.kind {
|
||||
MetaItemKind::List(..) => {}
|
||||
MetaItemKind::NameValue(lit) if !lit.kind.is_str() => {
|
||||
error!("argument value must be a string");
|
||||
}
|
||||
MetaItemKind::NameValue(..) | MetaItemKind::Word => {
|
||||
let ident = meta_item.ident().expect("multi-segment cfg key");
|
||||
return (ident.name, meta_item.value_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(..) => {}
|
||||
Err(err) => err.cancel(),
|
||||
Ok(..) => {}
|
||||
Err(err) => err.cancel(),
|
||||
},
|
||||
Err(errs) => errs.into_iter().for_each(|mut err| err.cancel()),
|
||||
}
|
||||
|
||||
error!(r#"expected `key` or `key="value"`"#);
|
||||
|
3
src/test/ui/conditional-compilation/cfg-arg-invalid-8.rs
Normal file
3
src/test/ui/conditional-compilation/cfg-arg-invalid-8.rs
Normal file
@ -0,0 +1,3 @@
|
||||
// compile-flags: --cfg )
|
||||
// error-pattern: invalid `--cfg` argument: `)` (expected `key` or `key="value"`)
|
||||
fn main() {}
|
@ -0,0 +1,2 @@
|
||||
error: invalid `--cfg` argument: `)` (expected `key` or `key="value"`)
|
||||
|
Loading…
Reference in New Issue
Block a user