diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index fbb273450df29..f6b05711c13db 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 0000000000000..8dfb7190c218d --- /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 or the MIT license +// , 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 0000000000000..8ede6eff2dd53 --- /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 or the MIT license +// , 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!()) +}