// A SourceFile created during compilation may have a relative // path (e.g. if rustc itself is invoked with a relative path). // When we write out crate metadata, we convert all relative paths // to absolute paths using the current working directory. // However, the working directory was previously not included in the crate hash. // This meant that the crate metadata could change while the crate // hash remained the same. Among other problems, this could cause a // fingerprint mismatch ICE, since incremental compilation uses // the crate metadata hash to determine if a foreign query is green. // This test checks that we don't get an ICE when the working directory // (but not the build directory!) changes between compilation // sessions. // See https://github.com/rust-lang/rust/issues/85019 //@ ignore-none // Reason: no-std is not supported //@ ignore-nvptx64-nvidia-cuda // FIXME: can't find crate for 'std' use run_make_support::{rfs, rust_lib_name, rustc}; fn main() { rfs::create_dir("incr"); rfs::create_dir("first_src"); rfs::create_dir("output"); rfs::rename("my_lib.rs", "first_src/my_lib.rs"); rfs::rename("main.rs", "first_src/main.rs"); // Build from "first_src" std::env::set_current_dir("first_src").unwrap(); rustc().input("my_lib.rs").incremental("incr").crate_type("lib").run(); rustc().input("main.rs").incremental("incr").extern_("my_lib", rust_lib_name("my_lib")).run(); std::env::set_current_dir("..").unwrap(); rfs::rename("first_src", "second_src"); std::env::set_current_dir("second_src").unwrap(); // Build from "second_src" - the output and incremental directory remain identical rustc().input("my_lib.rs").incremental("incr").crate_type("lib").run(); rustc().input("main.rs").incremental("incr").extern_("my_lib", rust_lib_name("my_lib")).run(); }