// When using the flag -C linker-plugin-lto, static libraries could lose their upstream object
// files during compilation. This bug was fixed in #53031, and this test compiles a staticlib
// dependent on upstream, checking that the upstream object file still exists after no LTO and
// thin LTO.
// See https://github.com/rust-lang/rust/pull/53031

use run_make_support::{
    cwd, has_extension, has_prefix, has_suffix, llvm_ar, rfs, rustc, shallow_find_files,
    static_lib_name,
};

fn main() {
    // The test starts with no LTO enabled.
    rustc().input("upstream.rs").arg("-Clinker-plugin-lto").codegen_units(1).run();
    rustc()
        .input("staticlib.rs")
        .arg("-Clinker-plugin-lto")
        .codegen_units(1)
        .output(static_lib_name("staticlib"))
        .run();
    llvm_ar().extract().arg(static_lib_name("staticlib")).run();
    // Ensure the upstream object file was included.
    assert_eq!(
        shallow_find_files(cwd(), |path| {
            has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o")
        })
        .len(),
        1
    );
    // Remove all output files that are not source Rust code for cleanup.
    for file in shallow_find_files(cwd(), |path| !has_extension(path, "rs")) {
        rfs::remove_file(file)
    }

    // Check it again, with Thin LTO.
    rustc()
        .input("upstream.rs")
        .arg("-Clinker-plugin-lto")
        .codegen_units(1)
        .arg("-Clto=thin")
        .run();
    rustc()
        .input("staticlib.rs")
        .arg("-Clinker-plugin-lto")
        .codegen_units(1)
        .arg("-Clto=thin")
        .output(static_lib_name("staticlib"))
        .run();
    llvm_ar().extract().arg(static_lib_name("staticlib")).run();
    assert_eq!(
        shallow_find_files(cwd(), |path| {
            has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o")
        })
        .len(),
        1
    );
}
