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;
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>()
}
+++ /dev/null
-// 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() {}
+++ /dev/null
-// 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() {}