Skip to content

Commit 2221d3a

Browse files
committed
Untruthful multiple different versions of a crate in the dependency graph
Currently, If `expected_def_id` and `another_trait_def_id` have their crate imported as ExternCrateSource::Path the method get_extern_crate_renamed_symbol() will return None for both, resulting in a false positive. This fixes the issue by using a slitly different approach, we use a predicate instead and do the comparison of the item names only when both crates are imported as ExternCrateSource::Extern, otherwise false is returned.
1 parent d682af8 commit 2221d3a

File tree

1 file changed

+23
-13
lines changed
  • compiler/rustc_trait_selection/src/error_reporting/traits

1 file changed

+23
-13
lines changed

compiler/rustc_trait_selection/src/error_reporting/traits/mod.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ use rustc_infer::traits::{
2222
};
2323
use rustc_middle::ty::print::{PrintTraitRefExt as _, with_no_trimmed_paths};
2424
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt as _};
25-
use rustc_span::{DesugaringKind, ErrorGuaranteed, ExpnKind, Span, Symbol};
25+
use rustc_session::cstore::{ExternCrate, ExternCrateSource};
26+
use rustc_span::{DesugaringKind, ErrorGuaranteed, ExpnKind, Span, sym};
2627
use tracing::{info, instrument};
2728

2829
pub use self::overflow::*;
@@ -353,14 +354,26 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
353354
}
354355
}
355356

356-
fn get_extern_crate_renamed_symbol(&self, trait_def_id: DefId) -> Option<Symbol> {
357-
if !trait_def_id.is_local()
358-
&& let Some(data) = self.tcx.extern_crate(trait_def_id.krate)
359-
&& let rustc_session::cstore::ExternCrateSource::Extern(def_id) = data.src
360-
{
361-
self.tcx.opt_item_name(def_id)
362-
} else {
363-
None
357+
fn extern_crates_with_the_same_name(
358+
&self,
359+
expected_def_id: DefId,
360+
trait_def_id: DefId,
361+
) -> bool {
362+
if expected_def_id.is_local() || trait_def_id.is_local() {
363+
return false;
364+
}
365+
match (
366+
self.tcx.extern_crate(expected_def_id.krate),
367+
self.tcx.extern_crate(trait_def_id.krate),
368+
) {
369+
(
370+
Some(ExternCrate { src: ExternCrateSource::Extern(expected_def_id), .. }),
371+
Some(ExternCrate { src: ExternCrateSource::Extern(trait_def_id), .. }),
372+
) => {
373+
let expected_sym = self.tcx.item_name(expected_def_id);
374+
expected_sym == self.tcx.item_name(trait_def_id) && expected_sym != sym::std
375+
}
376+
_ => false,
364377
}
365378
}
366379

@@ -377,13 +390,10 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
377390
{
378391
let krate = self.tcx.crate_name(expected_did.krate);
379392
let name = self.tcx.item_name(expected_did);
380-
let locally_renamed_krate = self
381-
.get_extern_crate_renamed_symbol(expected_did)
382-
.map_or(None, |s| if s != krate { Some(s) } else { None });
383393
let definitions_with_same_path: UnordSet<_> = found_dids
384394
.filter(|def_id| {
385395
def_id.krate != expected_did.krate
386-
&& (locally_renamed_krate == self.get_extern_crate_renamed_symbol(*def_id)
396+
&& (self.extern_crates_with_the_same_name(expected_did, *def_id)
387397
|| self.tcx.crate_name(def_id.krate) == krate)
388398
&& self.tcx.item_name(def_id) == name
389399
})

0 commit comments

Comments
 (0)