diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/session/config.rs | 39 | ||||
| -rw-r--r-- | src/test/compile-fail/cfg-arg-invalid.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/cfg-arg-invalid-1.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/cfg-arg-invalid-2.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/cfg-arg-invalid-3.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/cfg-arg-invalid-4.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/cfg-arg-invalid-5.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/issue-31495.rs | 13 |
8 files changed, 40 insertions, 40 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index e0532a3320b..1fe57bc338f 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -28,7 +28,7 @@ use rustc_data_structures::stable_hasher::ToStableHashKey; use lint; use middle::cstore; -use syntax::ast::{self, IntTy, UintTy}; +use syntax::ast::{self, IntTy, UintTy, MetaItemKind}; use syntax::codemap::{FileName, FilePathMapping}; use syntax::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION}; use syntax::parse::token; @@ -1746,22 +1746,33 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> 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::<ast::CrateConfig>() } diff --git a/src/test/compile-fail/cfg-arg-invalid.rs b/src/test/compile-fail/cfg-arg-invalid.rs deleted file mode 100644 index 404630399c6..00000000000 --- a/src/test/compile-fail/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 <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: --cfg a{b} -// error-pattern: invalid --cfg argument: a{b} -fn main() {} 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 00000000000..36dd78dd2b1 --- /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 00000000000..48d656a4a28 --- /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 00000000000..96ac7828c5c --- /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 00000000000..e7dfa17b4b6 --- /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 00000000000..a939f451038 --- /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/issue-31495.rs b/src/test/ui/issue-31495.rs deleted file mode 100644 index 794b8bb86bb..00000000000 --- a/src/test/ui/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 <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: --cfg foo(bar) -// error-pattern: invalid predicate in --cfg command line argument: `foo` -fn main() {} |
