| // 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(); |
| } |