| // The --extern flag can override the default crate search of |
| // the compiler and directly fetch a given path. There are a few rules |
| // to follow: for example, there can't be more than one rlib, the crates must |
| // be valid ("no-exist" in this test), and private crates can't be loaded |
| // as non-private. This test checks that these rules are enforced. |
| // See https://github.com/rust-lang/rust/pull/15319 |
| |
| use run_make_support::{rust_lib_name, rustc}; |
| |
| fn main() { |
| rustc().input("bar.rs").crate_type("rlib").run(); |
| // Exactly the same rlib as the first line, only the filename changes. |
| rustc().input("bar.rs").crate_type("rlib").extra_filename("-a").run(); |
| rustc().input("bar-alt.rs").crate_type("rlib").run(); |
| // The crate must be valid. |
| rustc().input("foo.rs").extern_("bar", "no-exist").run_fail(); |
| rustc().input("foo.rs").extern_("bar", "foo.rs").run_fail(); |
| // Compilation fails with two different rlibs. |
| rustc() |
| .input("foo.rs") |
| .extern_("bar", rust_lib_name("bar")) |
| .extern_("bar", rust_lib_name("bar-alt")) |
| .run_fail(); |
| // Even though this one has seemingly two rlibs, they are one and the same. |
| rustc() |
| .input("foo.rs") |
| .extern_("bar", rust_lib_name("bar")) |
| .extern_("bar", rust_lib_name("bar-a")) |
| .run(); |
| rustc().input("foo.rs").extern_("bar", rust_lib_name("bar")).run(); |
| // Try to be sneaky and load a private crate from with a non-private name. |
| rustc().input("rustc.rs").arg("-Zforce-unstable-if-unmarked").crate_type("rlib").run(); |
| rustc() |
| .input("gated_unstable.rs") |
| .extern_("alloc", rust_lib_name("rustc")) |
| .run_fail() |
| .assert_stderr_contains("rustc_private"); |
| } |