|
3 | 3 | use std::{fmt::Display, iter}; |
4 | 4 |
|
5 | 5 | use crate::{ |
6 | | - db::HirDatabase, infer::PointerCast, ClosureId, Const, ConstScalar, InferenceResult, Interner, |
7 | | - MemoryMap, Substitution, Ty, TyKind, |
| 6 | + db::HirDatabase, display::HirDisplay, infer::PointerCast, lang_items::is_box, ClosureId, Const, |
| 7 | + ConstScalar, InferenceResult, Interner, MemoryMap, Substitution, Ty, TyKind, |
8 | 8 | }; |
9 | 9 | use chalk_ir::Mutability; |
10 | 10 | use hir_def::{ |
@@ -115,8 +115,11 @@ impl<V, T> ProjectionElem<V, T> { |
115 | 115 | match self { |
116 | 116 | ProjectionElem::Deref => match &base.data(Interner).kind { |
117 | 117 | TyKind::Raw(_, inner) | TyKind::Ref(_, _, inner) => inner.clone(), |
| 118 | + TyKind::Adt(adt, subst) if is_box(db, adt.0) => { |
| 119 | + subst.at(Interner, 0).assert_ty_ref(Interner).clone() |
| 120 | + } |
118 | 121 | _ => { |
119 | | - never!("Overloaded deref is not a projection"); |
| 122 | + never!("Overloaded deref on type {} is not a projection", base.display(db)); |
120 | 123 | return TyKind::Error.intern(Interner); |
121 | 124 | } |
122 | 125 | }, |
|
0 commit comments