diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index ee3fabc58d53f..73c9729feee32 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -21,7 +21,7 @@ use rustc_target::spec::{Target, TargetTriple}; use lint; use middle::cstore; -use syntax::ast::{self, IntTy, UintTy}; +use syntax::ast::{self, IntTy, UintTy, MetaItemKind}; use syntax::source_map::{FileName, FilePathMapping}; use syntax::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION}; use syntax::parse::token; @@ -1735,22 +1735,33 @@ pub fn parse_cfgspecs(cfgspecs: Vec) -> ast::CrateConfig { let mut parser = parse::new_parser_from_source_str(&sess, FileName::CfgSpec, s.to_string()); - let meta_item = panictry!(parser.parse_meta_item()); + macro_rules! error {($reason: expr) => { + early_error(ErrorOutputType::default(), + &format!(concat!("invalid `--cfg` argument: `{}` (", $reason, ")"), s)); + }} - if parser.token != token::Eof { - early_error( - ErrorOutputType::default(), - &format!("invalid --cfg argument: {}", s), - ) - } else if meta_item.is_meta_item_list() { - let msg = format!( - "invalid predicate in --cfg command line argument: `{}`", - meta_item.ident - ); - early_error(ErrorOutputType::default(), &msg) + match &mut parser.parse_meta_item() { + Ok(meta_item) if parser.token == token::Eof => { + if meta_item.ident.segments.len() != 1 { + error!("argument key must be an identifier"); + } + match &meta_item.node { + MetaItemKind::List(..) => { + error!(r#"expected `key` or `key="value"`"#); + } + MetaItemKind::NameValue(lit) if !lit.node.is_str() => { + error!("argument value must be a string"); + } + MetaItemKind::NameValue(..) | MetaItemKind::Word => { + return (meta_item.name(), meta_item.value_str()); + } + } + } + Ok(..) => {} + Err(err) => err.cancel(), } - (meta_item.name(), meta_item.value_str()) + error!(r#"expected `key` or `key="value"`"#); }) .collect::() } diff --git a/src/test/ui/cfg-arg-invalid-1.rs b/src/test/ui/cfg-arg-invalid-1.rs new file mode 100644 index 0000000000000..36dd78dd2b19a --- /dev/null +++ b/src/test/ui/cfg-arg-invalid-1.rs @@ -0,0 +1,3 @@ +// compile-flags: --cfg a(b=c) +// error-pattern: invalid `--cfg` argument: `a(b=c)` (expected `key` or `key="value"`) +fn main() {} diff --git a/src/test/ui/cfg-arg-invalid-2.rs b/src/test/ui/cfg-arg-invalid-2.rs new file mode 100644 index 0000000000000..48d656a4a28d9 --- /dev/null +++ b/src/test/ui/cfg-arg-invalid-2.rs @@ -0,0 +1,3 @@ +// compile-flags: --cfg a{b} +// error-pattern: invalid `--cfg` argument: `a{b}` (expected `key` or `key="value"`) +fn main() {} diff --git a/src/test/ui/cfg-arg-invalid-3.rs b/src/test/ui/cfg-arg-invalid-3.rs new file mode 100644 index 0000000000000..96ac7828c5c3b --- /dev/null +++ b/src/test/ui/cfg-arg-invalid-3.rs @@ -0,0 +1,3 @@ +// compile-flags: --cfg a::b +// error-pattern: invalid `--cfg` argument: `a::b` (argument key must be an identifier) +fn main() {} diff --git a/src/test/ui/cfg-arg-invalid-4.rs b/src/test/ui/cfg-arg-invalid-4.rs new file mode 100644 index 0000000000000..e7dfa17b4b6c4 --- /dev/null +++ b/src/test/ui/cfg-arg-invalid-4.rs @@ -0,0 +1,3 @@ +// compile-flags: --cfg a(b) +// error-pattern: invalid `--cfg` argument: `a(b)` (expected `key` or `key="value"`) +fn main() {} diff --git a/src/test/ui/cfg-arg-invalid-5.rs b/src/test/ui/cfg-arg-invalid-5.rs new file mode 100644 index 0000000000000..a939f45103889 --- /dev/null +++ b/src/test/ui/cfg-arg-invalid-5.rs @@ -0,0 +1,3 @@ +// compile-flags: --cfg a=10 +// error-pattern: invalid `--cfg` argument: `a=10` (argument value must be a string) +fn main() {} diff --git a/src/test/ui/cfg-arg-invalid.rs b/src/test/ui/cfg-arg-invalid.rs deleted file mode 100644 index 404630399c601..0000000000000 --- a/src/test/ui/cfg-arg-invalid.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2016 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags: --cfg a{b} -// error-pattern: invalid --cfg argument: a{b} -fn main() {} diff --git a/src/test/ui/cfg-empty-codemap.rs b/src/test/ui/cfg-empty-codemap.rs index f06d22d985f49..5cf8135ca6bc6 100644 --- a/src/test/ui/cfg-empty-codemap.rs +++ b/src/test/ui/cfg-empty-codemap.rs @@ -12,7 +12,7 @@ // compile-flags: --cfg "" -// error-pattern: expected identifier, found +// error-pattern: invalid `--cfg` argument: `""` (expected `key` or `key="value"`) pub fn main() { } diff --git a/src/test/ui/issues/issue-31495.rs b/src/test/ui/issues/issue-31495.rs deleted file mode 100644 index 794b8bb86bb57..0000000000000 --- a/src/test/ui/issues/issue-31495.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2015 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags: --cfg foo(bar) -// error-pattern: invalid predicate in --cfg command line argument: `foo` -fn main() {}