From 1e4adaf11f52be0cbac5189c7b527016e48ca4ce Mon Sep 17 00:00:00 2001 From: Steven Tang Date: Sat, 19 Nov 2022 22:37:56 +1100 Subject: [PATCH 1/5] Fix CrateLocationUnknownType error --- compiler/rustc_metadata/src/errors.rs | 1 + compiler/rustc_metadata/src/locator.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_metadata/src/errors.rs b/compiler/rustc_metadata/src/errors.rs index e5b91d566e524..6f7e6e09ca5ed 100644 --- a/compiler/rustc_metadata/src/errors.rs +++ b/compiler/rustc_metadata/src/errors.rs @@ -692,6 +692,7 @@ pub struct CrateLocationUnknownType<'a> { #[primary_span] pub span: Span, pub path: &'a Path, + pub crate_name: Symbol, } #[derive(Diagnostic)] diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index 35f9ef92a1c42..bf346c86b583f 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -1024,7 +1024,7 @@ impl CrateError { if !locator.crate_rejections.via_filename.is_empty() { let mismatches = locator.crate_rejections.via_filename.iter(); for CrateMismatch { path, .. } in mismatches { - sess.emit_err(CrateLocationUnknownType { span, path: &path }); + sess.emit_err(CrateLocationUnknownType { span, path: &path, crate_name }); sess.emit_err(LibFilenameForm { span, dll_prefix: &locator.dll_prefix, From 40b7e0e5254d88e5f20d32e5845a368c9e47b7e5 Mon Sep 17 00:00:00 2001 From: Steven Tang Date: Sun, 20 Nov 2022 10:33:59 +1100 Subject: [PATCH 2/5] Fix metadata_lib_filename_form --- compiler/rustc_error_messages/locales/en-US/metadata.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_error_messages/locales/en-US/metadata.ftl b/compiler/rustc_error_messages/locales/en-US/metadata.ftl index c292ae9b32abb..b2afb98e55106 100644 --- a/compiler/rustc_error_messages/locales/en-US/metadata.ftl +++ b/compiler/rustc_error_messages/locales/en-US/metadata.ftl @@ -275,7 +275,7 @@ metadata_crate_location_unknown_type = extern location for {$crate_name} is of an unknown type: {$path} metadata_lib_filename_form = - file name should be lib*.rlib or {dll_prefix}*.{dll_suffix} + file name should be lib*.rlib or {$dll_prefix}*.{$dll_suffix} metadata_multiple_import_name_type = multiple `import_name_type` arguments in a single `#[link]` attribute From a1ea1c128d4e7c53965ae88d8b6ad0305d8c3d65 Mon Sep 17 00:00:00 2001 From: Steven Tang Date: Sun, 20 Nov 2022 10:44:16 +1100 Subject: [PATCH 3/5] Check that library is file --- compiler/rustc_metadata/src/locator.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index bf346c86b583f..046125a985a7b 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -707,6 +707,12 @@ impl<'a> CrateLocator<'a> { loc.original().clone(), )); } + if !loc.original().is_file() { + return Err(CrateError::ExternLocationNotFile( + self.crate_name, + loc.original().clone(), + )); + } let Some(file) = loc.original().file_name().and_then(|s| s.to_str()) else { return Err(CrateError::ExternLocationNotFile( self.crate_name, From 395f2b84e6fd4be029cb5af5559505cbc2c79983 Mon Sep 17 00:00:00 2001 From: Steven Tang Date: Tue, 22 Nov 2022 17:07:19 +1100 Subject: [PATCH 4/5] Remove extra . in metadata_lib_filename_form --- compiler/rustc_error_messages/locales/en-US/metadata.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_error_messages/locales/en-US/metadata.ftl b/compiler/rustc_error_messages/locales/en-US/metadata.ftl index b2afb98e55106..d1e1fd54db9bf 100644 --- a/compiler/rustc_error_messages/locales/en-US/metadata.ftl +++ b/compiler/rustc_error_messages/locales/en-US/metadata.ftl @@ -275,7 +275,7 @@ metadata_crate_location_unknown_type = extern location for {$crate_name} is of an unknown type: {$path} metadata_lib_filename_form = - file name should be lib*.rlib or {$dll_prefix}*.{$dll_suffix} + file name should be lib*.rlib or {$dll_prefix}*{$dll_suffix} metadata_multiple_import_name_type = multiple `import_name_type` arguments in a single `#[link]` attribute From 7169c7d1051a235d76eb24d704f19c1928abf383 Mon Sep 17 00:00:00 2001 From: Steven Tang Date: Tue, 22 Nov 2022 17:09:47 +1100 Subject: [PATCH 5/5] Tests for bad --extern library path and file --- compiler/rustc_metadata/src/locator.rs | 1 - .../ui/errors/issue-104621-extern-bad-file.rs | 8 +++++++ .../issue-104621-extern-bad-file.stderr | 21 +++++++++++++++++++ .../ui/errors/issue-104621-extern-not-file.rs | 4 ++++ .../issue-104621-extern-not-file.stderr | 8 +++++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/errors/issue-104621-extern-bad-file.rs create mode 100644 src/test/ui/errors/issue-104621-extern-bad-file.stderr create mode 100644 src/test/ui/errors/issue-104621-extern-not-file.rs create mode 100644 src/test/ui/errors/issue-104621-extern-not-file.stderr diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index 046125a985a7b..15546092e41a2 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -1026,7 +1026,6 @@ impl CrateError { None => String::new(), Some(r) => format!(" which `{}` depends on", r.name), }; - // FIXME: There are no tests for CrateLocationUnknownType or LibFilenameForm if !locator.crate_rejections.via_filename.is_empty() { let mismatches = locator.crate_rejections.via_filename.iter(); for CrateMismatch { path, .. } in mismatches { diff --git a/src/test/ui/errors/issue-104621-extern-bad-file.rs b/src/test/ui/errors/issue-104621-extern-bad-file.rs new file mode 100644 index 0000000000000..3f13d60523203 --- /dev/null +++ b/src/test/ui/errors/issue-104621-extern-bad-file.rs @@ -0,0 +1,8 @@ +// compile-flags: --extern foo={{src-base}}/errors/issue-104621-extern-bad-file.rs +// only-linux + +extern crate foo; +//~^ ERROR extern location for foo is of an unknown type +//~| ERROR file name should be lib*.rlib or lib*.so +//~| ERROR can't find crate for `foo` [E0463] +fn main() {} diff --git a/src/test/ui/errors/issue-104621-extern-bad-file.stderr b/src/test/ui/errors/issue-104621-extern-bad-file.stderr new file mode 100644 index 0000000000000..b8500ad0e045b --- /dev/null +++ b/src/test/ui/errors/issue-104621-extern-bad-file.stderr @@ -0,0 +1,21 @@ +error: extern location for foo is of an unknown type: $DIR/issue-104621-extern-bad-file.rs + --> $DIR/issue-104621-extern-bad-file.rs:4:1 + | +LL | extern crate foo; + | ^^^^^^^^^^^^^^^^^ + +error: file name should be lib*.rlib or lib*.so + --> $DIR/issue-104621-extern-bad-file.rs:4:1 + | +LL | extern crate foo; + | ^^^^^^^^^^^^^^^^^ + +error[E0463]: can't find crate for `foo` + --> $DIR/issue-104621-extern-bad-file.rs:4:1 + | +LL | extern crate foo; + | ^^^^^^^^^^^^^^^^^ can't find crate + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0463`. diff --git a/src/test/ui/errors/issue-104621-extern-not-file.rs b/src/test/ui/errors/issue-104621-extern-not-file.rs new file mode 100644 index 0000000000000..899e45a306b05 --- /dev/null +++ b/src/test/ui/errors/issue-104621-extern-not-file.rs @@ -0,0 +1,4 @@ +// compile-flags: --extern foo=. + +extern crate foo; //~ ERROR extern location for foo is not a file: . +fn main() {} diff --git a/src/test/ui/errors/issue-104621-extern-not-file.stderr b/src/test/ui/errors/issue-104621-extern-not-file.stderr new file mode 100644 index 0000000000000..5aaf9741360ef --- /dev/null +++ b/src/test/ui/errors/issue-104621-extern-not-file.stderr @@ -0,0 +1,8 @@ +error: extern location for foo is not a file: . + --> $DIR/issue-104621-extern-not-file.rs:3:1 + | +LL | extern crate foo; + | ^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error +