// It is possible, since #64882, to use the --extern flag without an explicit // path. In the event of two --extern flags, the explicit one with a path will take // priority, but otherwise, it is a more concise way of fetching specific libraries. // This test checks that the default priority of explicit extern flags and rlibs is // respected. // See https://github.com/rust-lang/rust/pull/64882 //@ ignore-cross-compile // Reason: the compiled binary is executed use run_make_support::{dynamic_lib_name, rfs, run, run_fail, rust_lib_name, rustc}; fn main() { rustc().input("bar.rs").crate_type("rlib").crate_type("dylib").arg("-Cprefer-dynamic").run(); // By default, the rlib has priority over the dylib. rustc().input("foo.rs").arg("--extern").arg("bar").run(); rfs::rename(dynamic_lib_name("bar"), "bar.tmp"); run("foo"); rfs::rename("bar.tmp", dynamic_lib_name("bar")); rustc().input("foo.rs").extern_("bar", rust_lib_name("bar")).arg("--extern").arg("bar").run(); rfs::rename(dynamic_lib_name("bar"), "bar.tmp"); run("foo"); rfs::rename("bar.tmp", dynamic_lib_name("bar")); // The first explicit usage of extern overrides the second pathless --extern bar. rustc() .input("foo.rs") .extern_("bar", dynamic_lib_name("bar")) .arg("--extern") .arg("bar") .run(); rfs::rename(dynamic_lib_name("bar"), "bar.tmp"); run_fail("foo"); rfs::rename("bar.tmp", dynamic_lib_name("bar")); // With prefer-dynamic, execution fails as it refuses to use the rlib. rustc().input("foo.rs").arg("--extern").arg("bar").arg("-Cprefer-dynamic").run(); rfs::rename(dynamic_lib_name("bar"), "bar.tmp"); run_fail("foo"); rfs::rename("bar.tmp", dynamic_lib_name("bar")); }