From b283aaf0ff74db93162b402e627f3b4ed7fb7d4e Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 18 Oct 2016 05:33:50 +0000 Subject: Future proof `#[no_link]`. --- src/librustc_metadata/macro_import.rs | 11 +++++++++-- src/librustc_resolve/build_reduced_graph.rs | 2 +- .../compile-fail-fulldeps/macro-crate-doesnt-resolve.rs | 3 +-- .../compile-fail-fulldeps/macro-crate-unknown-crate.rs | 14 -------------- src/test/compile-fail-fulldeps/no-link-unknown-crate.rs | 14 ++++++++++++++ src/test/compile-fail/no-link.rs | 2 +- 6 files changed, 26 insertions(+), 20 deletions(-) delete mode 100644 src/test/compile-fail-fulldeps/macro-crate-unknown-crate.rs create mode 100644 src/test/compile-fail-fulldeps/no-link-unknown-crate.rs (limited to 'src') diff --git a/src/librustc_metadata/macro_import.rs b/src/librustc_metadata/macro_import.rs index 3b1b2a4cd27..41e14ea9f40 100644 --- a/src/librustc_metadata/macro_import.rs +++ b/src/librustc_metadata/macro_import.rs @@ -52,6 +52,7 @@ impl<'a> CrateLoader<'a> { // Parse the attributes relating to macros. let mut import = ImportSelection::Some(FnvHashMap()); let mut reexport = FnvHashMap(); + let mut no_link = false; for attr in &extern_crate.attrs { let mut used = true; @@ -87,6 +88,7 @@ impl<'a> CrateLoader<'a> { } } } + "no_link" => no_link = true, _ => used = false, } if used { @@ -94,17 +96,22 @@ impl<'a> CrateLoader<'a> { } } - self.load_macros(extern_crate, allows_macros, import, reexport) + self.load_macros(extern_crate, allows_macros, import, reexport, no_link) } fn load_macros<'b>(&mut self, vi: &ast::Item, allows_macros: bool, import: ImportSelection, - reexport: MacroSelection) + reexport: MacroSelection, + no_link: bool) -> Vec { if let ImportSelection::Some(ref sel) = import { if sel.is_empty() && reexport.is_empty() { + // Make sure we can read macros from `#[no_link]` crates. + if no_link { + self.creader.read_macros(vi); + } return Vec::new(); } } diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index e0abe8da82b..a5bc708b4f0 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -250,7 +250,7 @@ impl<'b> Resolver<'b> { self.define(parent, name, TypeNS, (module, sp, vis)); self.populate_module_if_necessary(module); - } else if custom_derive_crate { + } else { // Define an empty module let def = Def::Mod(self.definitions.local_def_id(item.id)); let module = ModuleS::new(Some(parent), ModuleKind::Def(def, name)); diff --git a/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs b/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs index 1fbde00a3df..f563a1f88d0 100644 --- a/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs +++ b/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs @@ -14,6 +14,5 @@ extern crate macro_crate_test; fn main() { - macro_crate_test::foo(); - //~^ ERROR failed to resolve. Use of undeclared type or module `macro_crate_test` + macro_crate_test::foo(); //~ ERROR unresolved name } diff --git a/src/test/compile-fail-fulldeps/macro-crate-unknown-crate.rs b/src/test/compile-fail-fulldeps/macro-crate-unknown-crate.rs deleted file mode 100644 index 65657eea1ef..00000000000 --- a/src/test/compile-fail-fulldeps/macro-crate-unknown-crate.rs +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -#[macro_use] #[no_link] -extern crate doesnt_exist; //~ ERROR can't find crate - -fn main() {} diff --git a/src/test/compile-fail-fulldeps/no-link-unknown-crate.rs b/src/test/compile-fail-fulldeps/no-link-unknown-crate.rs new file mode 100644 index 00000000000..8e4692bdee1 --- /dev/null +++ b/src/test/compile-fail-fulldeps/no-link-unknown-crate.rs @@ -0,0 +1,14 @@ +// 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. + +#[no_link] +extern crate doesnt_exist; //~ ERROR can't find crate + +fn main() {} diff --git a/src/test/compile-fail/no-link.rs b/src/test/compile-fail/no-link.rs index 957b6cda553..8f6da99806b 100644 --- a/src/test/compile-fail/no-link.rs +++ b/src/test/compile-fail/no-link.rs @@ -13,6 +13,6 @@ extern crate libc; fn main() { unsafe { - libc::abs(0); //~ ERROR Use of undeclared type or module `libc` + libc::abs(0); //~ ERROR unresolved name } } -- cgit 1.4.1-3-g733a5