match cfg.name_or_empty() {
sym::any => mis
.iter()
- .any(|mi| eval_condition(mi.meta_item().unwrap(), sess, features, eval)),
+ // We don't use any() here, because we want to evaluate all cfg condition
+ // as eval_condition can (and does) extra checks
+ .fold(false, |res, mi| {
+ res | eval_condition(mi.meta_item().unwrap(), sess, features, eval)
+ }),
sym::all => mis
.iter()
- .all(|mi| eval_condition(mi.meta_item().unwrap(), sess, features, eval)),
+ // We don't use all() here, because we want to evaluate all cfg condition
+ // as eval_condition can (and does) extra checks
+ .fold(true, |res, mi| {
+ res & eval_condition(mi.meta_item().unwrap(), sess, features, eval)
+ }),
sym::not => {
if mis.len() != 1 {
struct_span_err!(
--- /dev/null
+// check-fail
+
+#[cfg(any(foo, foo::bar))]
+//~^ERROR `cfg` predicate key must be an identifier
+fn foo1() {}
+
+#[cfg(any(foo::bar, foo))]
+//~^ERROR `cfg` predicate key must be an identifier
+fn foo2() {}
+
+#[cfg(all(foo, foo::bar))]
+//~^ERROR `cfg` predicate key must be an identifier
+fn foo3() {}
+
+#[cfg(all(foo::bar, foo))]
+//~^ERROR `cfg` predicate key must be an identifier
+fn foo4() {}
+
+fn main() {}
--- /dev/null
+error: `cfg` predicate key must be an identifier
+ --> $DIR/cfg-path-error.rs:3:16
+ |
+LL | #[cfg(any(foo, foo::bar))]
+ | ^^^^^^^^
+
+error: `cfg` predicate key must be an identifier
+ --> $DIR/cfg-path-error.rs:7:11
+ |
+LL | #[cfg(any(foo::bar, foo))]
+ | ^^^^^^^^
+
+error: `cfg` predicate key must be an identifier
+ --> $DIR/cfg-path-error.rs:11:16
+ |
+LL | #[cfg(all(foo, foo::bar))]
+ | ^^^^^^^^
+
+error: `cfg` predicate key must be an identifier
+ --> $DIR/cfg-path-error.rs:15:11
+ |
+LL | #[cfg(all(foo::bar, foo))]
+ | ^^^^^^^^
+
+error: aborting due to 4 previous errors
+