Don't look in super traits for <T as Trait>::Assoc

This isn't actually how it works, you have to specify the exact trait
that has the associated type.

Fixes #8686.
This commit is contained in:
Florian Diebold 2021-04-29 20:21:50 +02:00
parent 2d20ab7eaf
commit c2aefd5b95
2 changed files with 14 additions and 7 deletions

View file

@ -414,17 +414,16 @@ impl<'a> TyLoweringContext<'a> {
self.lower_trait_ref_from_resolved_path(trait_, resolved_segment, self_ty);
let ty = if remaining_segments.len() == 1 {
let segment = remaining_segments.first().unwrap();
let found = associated_type_by_name_including_super_traits(
self.db,
trait_ref,
&segment.name,
);
let found = self
.db
.trait_data(trait_ref.hir_trait_id())
.associated_type_by_name(&segment.name);
match found {
Some((super_trait_ref, associated_ty)) => {
Some(associated_ty) => {
// FIXME handle type parameters on the segment
TyKind::Alias(AliasTy::Projection(ProjectionTy {
associated_ty_id: to_assoc_type_id(associated_ty),
substitution: super_trait_ref.substitution,
substitution: trait_ref.substitution,
}))
.intern(&Interner)
}

View file

@ -1039,6 +1039,14 @@ fn test() {
}
"#,
expect![[r#"
144..152 'residual': R
365..366 'r': ControlFlow<B, !>
395..410 '{ ControlFlow }': ControlFlow<B, C>
397..408 'ControlFlow': ControlFlow<B, C>
424..482 '{ ...!>); }': ()
430..456 'Contro...sidual': fn from_residual<ControlFlow<u32, {unknown}>, ControlFlow<u32, !>>(ControlFlow<u32, !>) -> ControlFlow<u32, {unknown}>
430..479 'Contro...2, !>)': ControlFlow<u32, {unknown}>
457..478 'Contro...32, !>': ControlFlow<u32, !>
"#]],
);
}