blob: a3d8516af662cf97a6a3936208810b7907be6fed [file] [edit]
// Tests that rustc produces helpful error messages when the input file
// cannot be opened, including specific messages for different error kinds
// and typo suggestions for NotFound errors.
//
// The permission-denied test requires Unix file mode bits and is skipped
// on Windows. It is also skipped on riscv64/arm because those CI runners
// run as root, which bypasses permission restrictions.
//@ ignore-riscv64
//@ ignore-arm
//@ ignore-windows
//@ needs-target-std
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
use run_make_support::{rfs, run_in_tmpdir, rustc};
fn main() {
// 1. NotFound — basic case: no "os error 2" in the output
run_in_tmpdir(|| {
rustc()
.input("fo.rs")
.run_fail()
.assert_stderr_contains("couldn't find file `fo.rs`")
.assert_stderr_not_contains("os error 2");
});
// 2. NotFound with typo suggestion: foo.rs exists, compiling fo.rs should suggest foo.rs
run_in_tmpdir(|| {
rfs::write("foo.rs", b"fn main() {}");
rustc()
.input("fo.rs")
.run_fail()
.assert_stderr_contains("couldn't find file `fo.rs`")
.assert_stderr_contains("you might have meant to open `foo.rs`");
});
// 3. PermissionDenied — file exists but is unreadable
run_in_tmpdir(|| {
rfs::write("secret.rs", b"fn main() {}");
let mut perms = rfs::metadata("secret.rs").permissions();
perms.set_mode(0o000); // no read, write, or execute
rfs::set_permissions("secret.rs", perms);
// Run rustc before restoring permissions, store the result
let output = rustc().input("secret.rs").run_fail();
// Restore permissions so the tmpdir cleanup can delete the file
let mut perms = rfs::metadata("secret.rs").permissions();
perms.set_mode(0o644);
rfs::set_permissions("secret.rs", perms);
output.assert_stderr_contains("permission denied when opening file");
});
// 4. IsADirectory — path points to a directory, not a file
run_in_tmpdir(|| {
rfs::create_dir("mydir.rs");
rustc().input("mydir.rs").run_fail().assert_stderr_contains("is a directory");
});
}