From 070d6b356e9cda1823d387e6e32921844b4131ee 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-with-cfg_attr/Makefile | 5 +++++ .../crate-attributes-with-cfg_attr/lib.rs | 13 +++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 src/test/run-make/crate-attributes-with-cfg_attr/Makefile create mode 100644 src/test/run-make/crate-attributes-with-cfg_attr/lib.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/run-make/crate-attributes-with-cfg_attr/Makefile b/src/test/run-make/crate-attributes-with-cfg_attr/Makefile new file mode 100644 index 0000000000000..b5c770f08001c --- /dev/null +++ b/src/test/run-make/crate-attributes-with-cfg_attr/Makefile @@ -0,0 +1,5 @@ +-include ../tools.mk + +all: + $(RUSTC) --cfg foo lib.rs + # if compilation worked, then it built as a library diff --git a/src/test/run-make/crate-attributes-with-cfg_attr/lib.rs b/src/test/run-make/crate-attributes-with-cfg_attr/lib.rs new file mode 100644 index 0000000000000..16da58da77f1b --- /dev/null +++ b/src/test/run-make/crate-attributes-with-cfg_attr/lib.rs @@ -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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![cfg_attr(foo, crate_type="lib")] + +pub fn foo() {}