]> git.lizzy.rs Git - rust.git/commitdiff
Move configuration 1 phase before crate metadata collection
authorKevin Ballard <kevin@sb.org>
Thu, 14 May 2015 07:54:05 +0000 (00:54 -0700)
committerKevin Ballard <kevin@sb.org>
Thu, 14 May 2015 17:35:35 +0000 (10:35 -0700)
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
src/test/auxiliary/crate-attributes-using-cfg_attr.rs [new file with mode: 0644]
src/test/run-pass/crate-attributes-using-cfg_attr.rs [new file with mode: 0644]

index 0073c0b061039806ff2503071d7eb167b18b8108..9c78c5aec00b44cae4399a300d1d31540a7a56c1 100644 (file)
@@ -383,17 +383,8 @@ pub fn phase_2_configure_and_expand(sess: &Session,
                                     -> Option<ast::Crate> {
     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 (file)
index 0000000..0028b51
--- /dev/null
@@ -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 <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.
+
+// 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 (file)
index 0000000..72ccc67
--- /dev/null
@@ -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 <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.
+
+// aux-build:crate-attributes-using-cfg_attr.rs
+
+extern crate crate_attributes_using_cfg_attr;
+
+pub fn main() {}