|
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