From b0a05c59818a149d67e1fba0b8a37671204c089d Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 2 Sep 2018 00:13:22 +0300 Subject: Validate syntax of `cfg` attributes --- src/libsyntax/attr/builtin.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/attr') diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs index 3eecdf14a4e..5fc9c5578e1 100644 --- a/src/libsyntax/attr/builtin.rs +++ b/src/libsyntax/attr/builtin.rs @@ -433,7 +433,21 @@ pub fn cfg_matches(cfg: &ast::MetaItem, sess: &ParseSess, features: Option<&Feat if let (Some(feats), Some(gated_cfg)) = (features, GatedCfg::gate(cfg)) { gated_cfg.check_and_emit(sess, feats); } - sess.config.contains(&(cfg.name(), cfg.value_str())) + let error = |span, msg| { sess.span_diagnostic.span_err(span, msg); true }; + if cfg.ident.segments.len() != 1 { + return error(cfg.ident.span, "`cfg` predicate key must be an identifier"); + } + match &cfg.node { + MetaItemKind::List(..) => { + error(cfg.span, "unexpected parentheses after `cfg` predicate key") + } + MetaItemKind::NameValue(lit) if !lit.node.is_str() => { + error(lit.span, "literal in `cfg` predicate value must be a string") + } + MetaItemKind::NameValue(..) | MetaItemKind::Word => { + sess.config.contains(&(cfg.name(), cfg.value_str())) + } + } }) } -- cgit 1.4.1-3-g733a5