]> git.lizzy.rs Git - rust.git/commitdiff
driver: Disallow predicates in --cfg specs
authorKamal Marhubi <kamal@marhubi.com>
Mon, 8 Feb 2016 21:38:35 +0000 (16:38 -0500)
committerKamal Marhubi <kamal@marhubi.com>
Mon, 8 Feb 2016 22:15:24 +0000 (17:15 -0500)
A spec like `#[cfg(foo(bar))]` is not allowed as an attribute. This
makes the same spec be rejected by the compiler if passed in as a
`--cfg` argument.

Fixes #31495

src/librustc_driver/lib.rs
src/test/compile-fail/issue-31495.rs [new file with mode: 0644]

index 5b0ee3cf973b07219886555aa6bcb4ceaec627bf..c4a1272e6d04dfdc0a527f9eaa9898075b13deb4 100644 (file)
@@ -348,10 +348,24 @@ fn handle_explain(code: &str,
     }
 }
 
+fn check_cfg(sopts: &config::Options,
+             output: ErrorOutputType) {
+    fn is_meta_list(item: &ast::MetaItem) -> bool {
+        match item.node {
+            ast::MetaItem_::MetaList(..) => true,
+            _ => false,
+        }
+    }
+
+    if sopts.cfg.iter().any(|item| is_meta_list(&*item)) {
+        early_error(output, "predicates are not allowed in --cfg");
+    }
+}
+
 impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
     fn early_callback(&mut self,
                       matches: &getopts::Matches,
-                      _sopts: &config::Options,
+                      sopts: &config::Options,
                       descriptions: &diagnostics::registry::Registry,
                       output: ErrorOutputType)
                       -> Compilation {
@@ -360,6 +374,7 @@ fn early_callback(&mut self,
             return Compilation::Stop;
         }
 
+        check_cfg(sopts, output);
         Compilation::Continue
     }
 
diff --git a/src/test/compile-fail/issue-31495.rs b/src/test/compile-fail/issue-31495.rs
new file mode 100644 (file)
index 0000000..0a09b65
--- /dev/null
@@ -0,0 +1,13 @@
+// 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: predicates are not allowed in --cfg
+fn main() {}