about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/driver/driver.rs13
-rw-r--r--src/test/run-pass/cfg-macros-foo.rs35
-rw-r--r--src/test/run-pass/cfg-macros-notfoo.rs35
3 files changed, 82 insertions, 1 deletions
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs
index fbb273450df..f6b05711c13 100644
--- a/src/librustc/driver/driver.rs
+++ b/src/librustc/driver/driver.rs
@@ -188,11 +188,22 @@ pub fn compile_rest(sess: Session,
         *sess.building_library = session::building_library(
             sess.opts.crate_type, crate_opt.unwrap(), sess.opts.test);
 
+        // strip before expansion to allow macros to depend on
+        // configuration variables e.g/ in
+        //
+        //   #[macro_escape] #[cfg(foo)]
+        //   mod bar { macro_rules! baz!(() => {{}}) }
+        //
+        // baz! should not use this definition unless foo is enabled.
+        crate_opt = Some(time(time_passes, ~"configuration 1", ||
+                     front::config::strip_unconfigured_items(crate_opt.unwrap())));
+
         crate_opt = Some(time(time_passes, ~"expansion", ||
                      syntax::ext::expand::expand_crate(sess.parse_sess, copy cfg,
                                                        crate_opt.unwrap())));
 
-        crate_opt = Some(time(time_passes, ~"configuration", ||
+        // strip again, in case expansion added anything with a #[cfg].
+        crate_opt = Some(time(time_passes, ~"configuration 2", ||
                      front::config::strip_unconfigured_items(crate_opt.unwrap())));
 
         crate_opt = Some(time(time_passes, ~"maybe building test harness", ||
diff --git a/src/test/run-pass/cfg-macros-foo.rs b/src/test/run-pass/cfg-macros-foo.rs
new file mode 100644
index 00000000000..8dfb7190c21
--- /dev/null
+++ b/src/test/run-pass/cfg-macros-foo.rs
@@ -0,0 +1,35 @@
+// Copyright 2013 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.
+
+// xfail-fast compile-flags directive doesn't work for check-fast
+// compile-flags: --cfg foo
+
+// check that cfg correctly chooses between the macro impls (see also
+// cfg-macros-notfoo.rs)
+
+#[cfg(foo)]
+#[macro_escape]
+mod foo {
+    macro_rules! bar {
+        () => { true }
+    }
+}
+
+#[cfg(not(foo))]
+#[macro_escape]
+mod foo {
+    macro_rules! bar {
+        () => { false }
+    }
+}
+
+fn main() {
+    assert!(bar!())
+}
diff --git a/src/test/run-pass/cfg-macros-notfoo.rs b/src/test/run-pass/cfg-macros-notfoo.rs
new file mode 100644
index 00000000000..8ede6eff2dd
--- /dev/null
+++ b/src/test/run-pass/cfg-macros-notfoo.rs
@@ -0,0 +1,35 @@
+// Copyright 2013 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.
+
+// xfail-fast compile-flags directive doesn't work for check-fast
+// compile-flags:
+
+// check that cfg correctly chooses between the macro impls (see also
+// cfg-macros-foo.rs)
+
+#[cfg(foo)]
+#[macro_escape]
+mod foo {
+    macro_rules! bar {
+        () => { true }
+    }
+}
+
+#[cfg(not(foo))]
+#[macro_escape]
+mod foo {
+    macro_rules! bar {
+        () => { false }
+    }
+}
+
+fn main() {
+    assert!(!bar!())
+}