about summary refs log tree commit diff
path: root/src/libsyntax/attr
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-09-07 15:14:52 +0000
committerbors <bors@rust-lang.org>2018-09-07 15:14:52 +0000
commit24ef47bccf487a2f80f71f228d71e35f89c5e1d3 (patch)
tree69dadaae1b4c213d5e085e4ea5b781f59424bba0 /src/libsyntax/attr
parent5a3292f163da3327523ddec5bc44d17c2378ec37 (diff)
parenta6adeae104c7dcc20025d92b984fd56427d93c1f (diff)
downloadrust-24ef47bccf487a2f80f71f228d71e35f89c5e1d3.tar.gz
rust-24ef47bccf487a2f80f71f228d71e35f89c5e1d3.zip
Auto merge of #53893 - petrochenkov:cfgexpr, r=pnkfelix
Validate syntax of `cfg` attributes

Fixes https://github.com/rust-lang/rust/issues/53298
Diffstat (limited to 'src/libsyntax/attr')
-rw-r--r--src/libsyntax/attr/builtin.rs16
1 files changed, 15 insertions, 1 deletions
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()))
+            }
+        }
     })
 }