Skip to content

Commit 24b39ec

Browse files
committed
refactor: merge E0465 into E0464
1 parent 5570cda commit 24b39ec

File tree

17 files changed

+59
-86
lines changed

17 files changed

+59
-86
lines changed

compiler/rustc_error_codes/src/error_codes.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ E0791: include_str!("./error_codes/E0791.md"),
598598
// E0421, // merged into 531
599599
// E0427, // merged into 530
600600
// E0456, // plugin `..` is not available for triple `..`
601-
E0465, // multiple .. candidates for `..` found
601+
// E0465, // removed: merged with E0464
602602
// E0467, // removed
603603
// E0470, // removed
604604
// E0471, // constant evaluation error (in pattern)

compiler/rustc_error_messages/locales/en-US/metadata.ftl

+1-5
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,7 @@ metadata_extern_location_not_file =
196196
extern location for {$crate_name} is not a file: {$location}
197197
198198
metadata_multiple_candidates =
199-
multiple {$flavor} candidates for `{$crate_name}` found
200-
201-
metadata_multiple_matching_crates =
202-
multiple matching crates for `{$crate_name}`
203-
.note = candidates:{$candidates}
199+
multiple candidates for `{$flavor}` dependency `{$crate_name}` found
204200
205201
metadata_symbol_conflicts_current =
206202
the current crate is indistinguishable from one of its dependencies: it has the same crate-name `{$crate_name}` and was compiled with the same `-C metadata` arguments. This will result in symbol conflicts between the two.

compiler/rustc_metadata/src/errors.rs

+2-12
Original file line numberDiff line numberDiff line change
@@ -486,25 +486,15 @@ impl IntoDiagnostic<'_> for MultipleCandidates {
486486
let mut diag = handler.struct_err(rustc_errors::fluent::metadata_multiple_candidates);
487487
diag.set_arg("crate_name", self.crate_name);
488488
diag.set_arg("flavor", self.flavor);
489-
diag.code(error_code!(E0465));
489+
diag.code(error_code!(E0464));
490490
diag.set_span(self.span);
491491
for (i, candidate) in self.candidates.iter().enumerate() {
492-
diag.span_note(self.span, &format!("candidate #{}: {}", i + 1, candidate.display()));
492+
diag.note(&format!("candidate #{}: {}", i + 1, candidate.display()));
493493
}
494494
diag
495495
}
496496
}
497497

498-
#[derive(Diagnostic)]
499-
#[diag(metadata_multiple_matching_crates, code = "E0464")]
500-
#[note]
501-
pub struct MultipleMatchingCrates {
502-
#[primary_span]
503-
pub span: Span,
504-
pub crate_name: Symbol,
505-
pub candidates: String,
506-
}
507-
508498
#[derive(Diagnostic)]
509499
#[diag(metadata_symbol_conflicts_current, code = "E0519")]
510500
pub struct SymbolConflictsCurrent {

compiler/rustc_metadata/src/locator.rs

+29-42
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,8 @@ use crate::creader::Library;
216216
use crate::errors::{
217217
CannotFindCrate, CrateLocationUnknownType, DlError, ExternLocationNotExist,
218218
ExternLocationNotFile, FoundStaticlib, IncompatibleRustc, InvalidMetadataFiles,
219-
LibFilenameForm, MultipleCandidates, MultipleMatchingCrates, NewerCrateVersion,
220-
NoCrateWithTriple, NoDylibPlugin, NonAsciiName, StableCrateIdCollision, SymbolConflictsCurrent,
221-
SymbolConflictsOthers,
219+
LibFilenameForm, MultipleCandidates, NewerCrateVersion, NoCrateWithTriple, NoDylibPlugin,
220+
NonAsciiName, StableCrateIdCollision, SymbolConflictsCurrent, SymbolConflictsOthers,
222221
};
223222
use crate::rmeta::{rustc_version, MetadataBlob, METADATA_HEADER};
224223

@@ -240,7 +239,6 @@ use rustc_target::spec::{Target, TargetTriple};
240239

241240
use snap::read::FrameDecoder;
242241
use std::borrow::Cow;
243-
use std::fmt::Write as _;
244242
use std::io::{Read, Result as IoResult, Write};
245243
use std::path::{Path, PathBuf};
246244
use std::{cmp, fmt, fs};
@@ -482,7 +480,22 @@ impl<'a> CrateLocator<'a> {
482480
match libraries.len() {
483481
0 => Ok(None),
484482
1 => Ok(Some(libraries.into_iter().next().unwrap().1)),
485-
_ => Err(CrateError::MultipleMatchingCrates(self.crate_name, libraries)),
483+
_ => {
484+
let mut libraries: Vec<_> = libraries.into_values().collect();
485+
486+
libraries.sort_by_cached_key(|lib| lib.source.paths().next().unwrap().clone());
487+
let candidates = libraries
488+
.iter()
489+
.map(|lib| lib.source.paths().next().unwrap().clone())
490+
.collect::<Vec<_>>();
491+
492+
Err(CrateError::MultipleCandidates(
493+
self.crate_name,
494+
// these are the same for all candidates
495+
get_flavor_from_path(candidates.first().unwrap()),
496+
candidates,
497+
))
498+
}
486499
}
487500
}
488501

@@ -882,17 +895,22 @@ pub fn list_file_metadata(
882895
metadata_loader: &dyn MetadataLoader,
883896
out: &mut dyn Write,
884897
) -> IoResult<()> {
898+
let flavor = get_flavor_from_path(path);
899+
match get_metadata_section(target, flavor, path, metadata_loader) {
900+
Ok(metadata) => metadata.list_crate_metadata(out),
901+
Err(msg) => write!(out, "{}\n", msg),
902+
}
903+
}
904+
905+
fn get_flavor_from_path(path: &Path) -> CrateFlavor {
885906
let filename = path.file_name().unwrap().to_str().unwrap();
886-
let flavor = if filename.ends_with(".rlib") {
907+
908+
if filename.ends_with(".rlib") {
887909
CrateFlavor::Rlib
888910
} else if filename.ends_with(".rmeta") {
889911
CrateFlavor::Rmeta
890912
} else {
891913
CrateFlavor::Dylib
892-
};
893-
match get_metadata_section(target, flavor, path, metadata_loader) {
894-
Ok(metadata) => metadata.list_crate_metadata(out),
895-
Err(msg) => write!(out, "{}\n", msg),
896914
}
897915
}
898916

@@ -931,7 +949,6 @@ pub(crate) enum CrateError {
931949
ExternLocationNotExist(Symbol, PathBuf),
932950
ExternLocationNotFile(Symbol, PathBuf),
933951
MultipleCandidates(Symbol, CrateFlavor, Vec<PathBuf>),
934-
MultipleMatchingCrates(Symbol, FxHashMap<Svh, Library>),
935952
SymbolConflictsCurrent(Symbol),
936953
SymbolConflictsOthers(Symbol),
937954
StableCrateIdCollision(Symbol, Symbol),
@@ -972,37 +989,7 @@ impl CrateError {
972989
sess.emit_err(ExternLocationNotFile { span, crate_name, location: &loc });
973990
}
974991
CrateError::MultipleCandidates(crate_name, flavor, candidates) => {
975-
sess.emit_err(MultipleCandidates { span, flavor: flavor, crate_name, candidates });
976-
}
977-
CrateError::MultipleMatchingCrates(crate_name, libraries) => {
978-
let mut libraries: Vec<_> = libraries.into_values().collect();
979-
// Make ordering of candidates deterministic.
980-
// This has to `clone()` to work around lifetime restrictions with `sort_by_key()`.
981-
// `sort_by()` could be used instead, but this is in the error path,
982-
// so the performance shouldn't matter.
983-
libraries.sort_by_cached_key(|lib| lib.source.paths().next().unwrap().clone());
984-
let candidates = libraries
985-
.iter()
986-
.map(|lib| {
987-
let crate_name = lib.metadata.get_root().name();
988-
let crate_name = crate_name.as_str();
989-
let mut paths = lib.source.paths();
990-
991-
// This `unwrap()` should be okay because there has to be at least one
992-
// source file. `CrateSource`'s docs confirm that too.
993-
let mut s = format!(
994-
"\ncrate `{}`: {}",
995-
crate_name,
996-
paths.next().unwrap().display()
997-
);
998-
let padding = 8 + crate_name.len();
999-
for path in paths {
1000-
write!(s, "\n{:>padding$}", path.display(), padding = padding).unwrap();
1001-
}
1002-
s
1003-
})
1004-
.collect::<String>();
1005-
sess.emit_err(MultipleMatchingCrates { span, crate_name, candidates });
992+
sess.emit_err(MultipleCandidates { span, crate_name, flavor, candidates });
1006993
}
1007994
CrateError::SymbolConflictsCurrent(root_name) => {
1008995
sess.emit_err(SymbolConflictsCurrent { span, crate_name: root_name });

src/test/ui/crate-loading/auxiliary/crateresolve1-1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-1
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/test/ui/crate-loading/auxiliary/crateresolve1-2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-2
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/test/ui/crate-loading/auxiliary/crateresolve1-3.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-3
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/test/ui/crate-loading/crateresolve1.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// NOTE: This test is duplicated at `src/test/ui/error-codes/E0464.rs`.
1010

1111
extern crate crateresolve1;
12-
//~^ ERROR multiple matching crates for `crateresolve1`
12+
//~^ ERROR multiple candidates for `rlib` dependency `crateresolve1` found
1313

14-
fn main() {
15-
}
14+
fn main() {}

src/test/ui/crate-loading/crateresolve1.stderr

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
error[E0464]: multiple matching crates for `crateresolve1`
1+
error[E0464]: multiple candidates for `rlib` dependency `crateresolve1` found
22
--> $DIR/crateresolve1.rs:11:1
33
|
44
LL | extern crate crateresolve1;
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
|
7-
= note: candidates:
8-
crate `crateresolve1`: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-1.somelib
9-
crate `crateresolve1`: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-2.somelib
10-
crate `crateresolve1`: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-3.somelib
7+
= note: candidate #1: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-1.somelib
8+
= note: candidate #2: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-2.somelib
9+
= note: candidate #3: $TEST_BUILD_DIR/crate-loading/crateresolve1/auxiliary/libcrateresolve1-3.somelib
1110

1211
error: aborting due to previous error
1312

src/test/ui/crate-loading/crateresolve2.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// normalize-stderr-test: "\\\?\\" -> ""
99

1010
extern crate crateresolve2;
11-
//~^ ERROR multiple matching crates for `crateresolve2`
11+
//~^ ERROR multiple candidates for `rmeta` dependency `crateresolve2` found
1212

13-
fn main() {
14-
}
13+
fn main() {}

src/test/ui/crate-loading/crateresolve2.stderr

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
error[E0464]: multiple matching crates for `crateresolve2`
1+
error[E0464]: multiple candidates for `rmeta` dependency `crateresolve2` found
22
--> $DIR/crateresolve2.rs:10:1
33
|
44
LL | extern crate crateresolve2;
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
|
7-
= note: candidates:
8-
crate `crateresolve2`: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-1.rmeta
9-
crate `crateresolve2`: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-2.rmeta
10-
crate `crateresolve2`: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-3.rmeta
7+
= note: candidate #1: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-1.rmeta
8+
= note: candidate #2: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-2.rmeta
9+
= note: candidate #3: $TEST_BUILD_DIR/crate-loading/crateresolve2/auxiliary/libcrateresolve2-3.rmeta
1110

1211
error: aborting due to previous error
1312

src/test/ui/error-codes/E0464.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// NOTE: This test is duplicated from `src/test/ui/crate-loading/crateresolve1.rs`.
1010

1111
extern crate crateresolve1;
12-
//~^ ERROR multiple matching crates for `crateresolve1`
12+
//~^ ERROR multiple candidates for `rlib` dependency `crateresolve1` found
1313

14-
fn main() {
15-
}
14+
fn main() {}

src/test/ui/error-codes/E0464.stderr

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
error[E0464]: multiple matching crates for `crateresolve1`
1+
error[E0464]: multiple candidates for `rlib` dependency `crateresolve1` found
22
--> $DIR/E0464.rs:11:1
33
|
44
LL | extern crate crateresolve1;
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
|
7-
= note: candidates:
8-
crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-1.somelib
9-
crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-2.somelib
10-
crate `crateresolve1`: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-3.somelib
7+
= note: candidate #1: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-1.somelib
8+
= note: candidate #2: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-2.somelib
9+
= note: candidate #3: $TEST_BUILD_DIR/error-codes/E0464/auxiliary/libcrateresolve1-3.somelib
1110

1211
error: aborting due to previous error
1312

src/test/ui/error-codes/auxiliary/crateresolve1-1.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-1
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/test/ui/error-codes/auxiliary/crateresolve1-2.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-2
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/test/ui/error-codes/auxiliary/crateresolve1-3.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// compile-flags:-C extra-filename=-3
2+
// no-prefer-dynamic
23
#![crate_name = "crateresolve1"]
34
#![crate_type = "lib"]
45

src/tools/tidy/src/error_codes_check.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use regex::Regex;
1111

1212
// A few of those error codes can't be tested but all the others can and *should* be tested!
1313
const EXEMPTED_FROM_TEST: &[&str] = &[
14-
"E0313", "E0461", "E0465", "E0476", "E0490", "E0514", "E0523", "E0554", "E0640", "E0717",
15-
"E0729", "E0789",
14+
"E0313", "E0461", "E0476", "E0490", "E0514", "E0523", "E0554", "E0640", "E0717", "E0729",
15+
"E0789",
1616
];
1717

1818
// Some error codes don't have any tests apparently...

0 commit comments

Comments
 (0)