From 90b952954bf7e765924f70a8892334b6bb7de93b Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Thu, 14 May 2015 00:54:05 -0700 Subject: [PATCH] Move configuration 1 phase before crate metadata collection Stripping unconfigured items prior to collecting crate metadata means we can say things like `#![cfg_attr(foo, crate_type="lib")]`. Fixes #25347. --- src/librustc_driver/driver.rs | 22 +++++++++---------- .../crate-attributes-using-cfg_attr.rs | 16 ++++++++++++++ .../crate-attributes-using-cfg_attr.rs | 15 +++++++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 src/test/auxiliary/crate-attributes-using-cfg_attr.rs create mode 100644 src/test/run-pass/crate-attributes-using-cfg_attr.rs diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 0073c0b061039..9c78c5aec00b4 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -383,17 +383,8 @@ pub fn phase_2_configure_and_expand(sess: &Session, -> Option { let time_passes = sess.time_passes(); - *sess.crate_types.borrow_mut() = - collect_crate_types(sess, &krate.attrs); - *sess.crate_metadata.borrow_mut() = - collect_crate_metadata(sess, &krate.attrs); - - time(time_passes, "recursion limit", (), |_| { - middle::recursion_limit::update_recursion_limit(sess, &krate); - }); - - // strip before expansion to allow macros to depend on - // configuration variables e.g/ in + // strip before anything else because crate metadata may use #[cfg_attr] + // and so macros can depend on configuration variables, such as // // #[macro_use] #[cfg(foo)] // mod bar { macro_rules! baz!(() => {{}}) } @@ -403,6 +394,15 @@ pub fn phase_2_configure_and_expand(sess: &Session, krate = time(time_passes, "configuration 1", krate, |krate| syntax::config::strip_unconfigured_items(sess.diagnostic(), krate)); + *sess.crate_types.borrow_mut() = + collect_crate_types(sess, &krate.attrs); + *sess.crate_metadata.borrow_mut() = + collect_crate_metadata(sess, &krate.attrs); + + time(time_passes, "recursion limit", (), |_| { + middle::recursion_limit::update_recursion_limit(sess, &krate); + }); + time(time_passes, "gated macro checking", (), |_| { let features = syntax::feature_gate::check_crate_macros(sess.codemap(), diff --git a/src/test/auxiliary/crate-attributes-using-cfg_attr.rs b/src/test/auxiliary/crate-attributes-using-cfg_attr.rs new file mode 100644 index 0000000000000..0028b51f9d1ee --- /dev/null +++ b/src/test/auxiliary/crate-attributes-using-cfg_attr.rs @@ -0,0 +1,16 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// no-prefer-dynamic +// compile-flags: --cfg foo + +#![cfg_attr(foo, crate_type="lib")] + +pub fn foo() {} diff --git a/src/test/run-pass/crate-attributes-using-cfg_attr.rs b/src/test/run-pass/crate-attributes-using-cfg_attr.rs new file mode 100644 index 0000000000000..72ccc6723f921 --- /dev/null +++ b/src/test/run-pass/crate-attributes-using-cfg_attr.rs @@ -0,0 +1,15 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:crate-attributes-using-cfg_attr.rs + +extern crate crate_attributes_using_cfg_attr; + +pub fn main() {}