From cc6a09009d5129f1221dc0e93c08c84967d1015e Mon Sep 17 00:00:00 2001
From: Noah Lev <camelidcamel@gmail.com>
Date: Wed, 6 Oct 2021 13:01:43 -0700
Subject: [PATCH] Add long explanation for E0464

The test is copied from `src/test/ui/crate-loading/crateresolve1.rs` and
its auxiliary tests. I added it to the `compile_fail` code example check
exemption list since it's hard if not impossible to reproduce this error
in a standalone code example.
---
 compiler/rustc_error_codes/src/error_codes.rs     |  2 +-
 .../rustc_error_codes/src/error_codes/E0464.md    |  6 ++++++
 src/test/ui/crate-loading/crateresolve1.rs        |  2 ++
 src/test/ui/crate-loading/crateresolve1.stderr    |  3 ++-
 src/test/ui/crate-loading/crateresolve2.stderr    |  1 +
 src/test/ui/error-codes/E0464.rs                  | 15 +++++++++++++++
 src/test/ui/error-codes/E0464.stderr              | 14 ++++++++++++++
 .../ui/error-codes/auxiliary/crateresolve1-1.rs   |  5 +++++
 .../ui/error-codes/auxiliary/crateresolve1-2.rs   |  5 +++++
 .../ui/error-codes/auxiliary/crateresolve1-3.rs   |  5 +++++
 src/tools/tidy/src/error_codes_check.rs           |  2 +-
 11 files changed, 57 insertions(+), 3 deletions(-)
 create mode 100644 compiler/rustc_error_codes/src/error_codes/E0464.md
 create mode 100644 src/test/ui/error-codes/E0464.rs
 create mode 100644 src/test/ui/error-codes/E0464.stderr
 create mode 100644 src/test/ui/error-codes/auxiliary/crateresolve1-1.rs
 create mode 100644 src/test/ui/error-codes/auxiliary/crateresolve1-2.rs
 create mode 100644 src/test/ui/error-codes/auxiliary/crateresolve1-3.rs

diff --git a/compiler/rustc_error_codes/src/error_codes.rs b/compiler/rustc_error_codes/src/error_codes.rs
index 1b4b58314b3..27b2bfbaf47 100644
--- a/compiler/rustc_error_codes/src/error_codes.rs
+++ b/compiler/rustc_error_codes/src/error_codes.rs
@@ -237,6 +237,7 @@ E0455: include_str!("./error_codes/E0455.md"),
 E0458: include_str!("./error_codes/E0458.md"),
 E0459: include_str!("./error_codes/E0459.md"),
 E0463: include_str!("./error_codes/E0463.md"),
+E0464: include_str!("./error_codes/E0464.md"),
 E0466: include_str!("./error_codes/E0466.md"),
 E0468: include_str!("./error_codes/E0468.md"),
 E0469: include_str!("./error_codes/E0469.md"),
@@ -587,7 +588,6 @@ E0785: include_str!("./error_codes/E0785.md"),
     E0460, // found possibly newer version of crate `..`
     E0461, // couldn't find crate `..` with expected target triple ..
     E0462, // found staticlib `..` instead of rlib or dylib
-    E0464, // multiple matching crates for `..`
     E0465, // multiple .. candidates for `..` found
 //  E0467, removed
 //  E0470, removed
diff --git a/compiler/rustc_error_codes/src/error_codes/E0464.md b/compiler/rustc_error_codes/src/error_codes/E0464.md
new file mode 100644
index 00000000000..9108d856c9d
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0464.md
@@ -0,0 +1,6 @@
+The compiler found multiple library files with the requested crate name.
+
+This error can occur in several different cases -- for example, when using
+`extern crate` or passing `--extern` options without crate paths. It can also be
+caused by caching issues with the build directory, in which case `cargo clean`
+may help.
diff --git a/src/test/ui/crate-loading/crateresolve1.rs b/src/test/ui/crate-loading/crateresolve1.rs
index 8e01862746f..c071a9b4b6a 100644
--- a/src/test/ui/crate-loading/crateresolve1.rs
+++ b/src/test/ui/crate-loading/crateresolve1.rs
@@ -6,6 +6,8 @@
 // normalize-stderr-test: "\\\?\\" -> ""
 // normalize-stderr-test: "libcrateresolve1-([123])\.[a-z]+" -> "libcrateresolve1-$1.somelib"
 
+// NOTE: This test is duplicated at `src/test/ui/error-codes/E0464.rs`.
+
 extern crate crateresolve1;
 //~^ ERROR multiple matching crates for `crateresolve1`
 
diff --git a/src/test/ui/crate-loading/crateresolve1.stderr b/src/test/ui/crate-loading/crateresolve1.stderr
index 1cae13922d6..0d7538eafd8 100644
--- a/src/test/ui/crate-loading/crateresolve1.stderr
+++ b/src/test/ui/crate-loading/crateresolve1.stderr
@@ -1,5 +1,5 @@
 error[E0464]: multiple matching crates for `crateresolve1`
-  --> $DIR/crateresolve1.rs:9:1
+  --> $DIR/crateresolve1.rs:11:1
    |
 LL | extern crate crateresolve1;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -11,3 +11,4 @@ LL | extern crate crateresolve1;
 
 error: aborting due to previous error
 
+For more information about this error, try `rustc --explain E0464`.
diff --git a/src/test/ui/crate-loading/crateresolve2.stderr b/src/test/ui/crate-loading/crateresolve2.stderr
index c6da629df27..afd3702de7f 100644
--- a/src/test/ui/crate-loading/crateresolve2.stderr
+++ b/src/test/ui/crate-loading/crateresolve2.stderr
@@ -11,3 +11,4 @@ LL | extern crate crateresolve2;
 
 error: aborting due to previous error
 
+For more information about this error, try `rustc --explain E0464`.
diff --git a/src/test/ui/error-codes/E0464.rs b/src/test/ui/error-codes/E0464.rs
new file mode 100644
index 00000000000..831f32116a5
--- /dev/null
+++ b/src/test/ui/error-codes/E0464.rs
@@ -0,0 +1,15 @@
+// aux-build:crateresolve1-1.rs
+// aux-build:crateresolve1-2.rs
+// aux-build:crateresolve1-3.rs
+
+// normalize-stderr-test: "\.nll/" -> "/"
+// normalize-stderr-test: "\\\?\\" -> ""
+// normalize-stderr-test: "libcrateresolve1-([123])\.[a-z]+" -> "libcrateresolve1-$1.somelib"
+
+// NOTE: This test is duplicated from `src/test/ui/crate-loading/crateresolve1.rs`.
+
+extern crate crateresolve1;
+//~^ ERROR multiple matching crates for `crateresolve1`
+
+fn main() {
+}
diff --git a/src/test/ui/error-codes/E0464.stderr b/src/test/ui/error-codes/E0464.stderr
new file mode 100644
index 00000000000..3d950ddd28e
--- /dev/null
+++ b/src/test/ui/error-codes/E0464.stderr
@@ -0,0 +1,14 @@
+error[E0464]: multiple matching crates for `crateresolve1`
+  --> $DIR/E0464.rs:11:1
+   |
+LL | extern crate crateresolve1;
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: candidates:
+           crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-1.somelib
+           crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-2.somelib
+           crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-3.somelib
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0464`.
diff --git a/src/test/ui/error-codes/auxiliary/crateresolve1-1.rs b/src/test/ui/error-codes/auxiliary/crateresolve1-1.rs
new file mode 100644
index 00000000000..a00a19e46d5
--- /dev/null
+++ b/src/test/ui/error-codes/auxiliary/crateresolve1-1.rs
@@ -0,0 +1,5 @@
+// compile-flags:-C extra-filename=-1
+#![crate_name = "crateresolve1"]
+#![crate_type = "lib"]
+
+pub fn f() -> isize { 10 }
diff --git a/src/test/ui/error-codes/auxiliary/crateresolve1-2.rs b/src/test/ui/error-codes/auxiliary/crateresolve1-2.rs
new file mode 100644
index 00000000000..71cc0a12ea3
--- /dev/null
+++ b/src/test/ui/error-codes/auxiliary/crateresolve1-2.rs
@@ -0,0 +1,5 @@
+// compile-flags:-C extra-filename=-2
+#![crate_name = "crateresolve1"]
+#![crate_type = "lib"]
+
+pub fn f() -> isize { 20 }
diff --git a/src/test/ui/error-codes/auxiliary/crateresolve1-3.rs b/src/test/ui/error-codes/auxiliary/crateresolve1-3.rs
new file mode 100644
index 00000000000..921687d4c3b
--- /dev/null
+++ b/src/test/ui/error-codes/auxiliary/crateresolve1-3.rs
@@ -0,0 +1,5 @@
+// compile-flags:-C extra-filename=-3
+#![crate_name = "crateresolve1"]
+#![crate_type = "lib"]
+
+pub fn f() -> isize { 30 }
diff --git a/src/tools/tidy/src/error_codes_check.rs b/src/tools/tidy/src/error_codes_check.rs
index 6d802cdcd03..6d3e470bf43 100644
--- a/src/tools/tidy/src/error_codes_check.rs
+++ b/src/tools/tidy/src/error_codes_check.rs
@@ -15,7 +15,7 @@ const EXEMPTED_FROM_TEST: &[&str] = &[
 ];
 
 // Some error codes don't have any tests apparently...
-const IGNORE_EXPLANATION_CHECK: &[&str] = &["E0570", "E0601", "E0602", "E0729"];
+const IGNORE_EXPLANATION_CHECK: &[&str] = &["E0464", "E0570", "E0601", "E0602", "E0729"];
 
 // If the file path contains any of these, we don't want to try to extract error codes from it.
 //