]> git.lizzy.rs Git - rust.git/commitdiff
Don't look in super traits for <T as Trait>::Assoc
authorFlorian Diebold <flodiebold@gmail.com>
Thu, 29 Apr 2021 18:21:50 +0000 (20:21 +0200)
committerFlorian Diebold <flodiebold@gmail.com>
Thu, 29 Apr 2021 18:23:02 +0000 (20:23 +0200)
This isn't actually how it works, you have to specify the exact trait
that has the associated type.

Fixes #8686.

crates/hir_ty/src/lower.rs
crates/hir_ty/src/tests/regression.rs

index d01933e6baec637564ac8f1d2d6383cd32377cd7..c99dd8d0a46d5b1c56a283d6a46aaebdfabbee3d 100644 (file)
@@ -414,17 +414,16 @@ pub(crate) fn lower_partly_resolved_path(
                     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)
                         }
index add12c6dbe9f4f64b283e2e78b21120185558b56..d14f5c9bb11af73c43f047055870c29c734e6ae8 100644 (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, !>
         "#]],
     );
 }