Structurally resolve before matching on type of projection

This commit is contained in:
Michael Goulet 2024-11-27 02:14:05 +00:00
parent f2abf827c1
commit 48b2bbd0de
2 changed files with 27 additions and 2 deletions

View File

@ -1802,7 +1802,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut is_mutbl = bm.1;
for pointer_ty in place.deref_tys() {
match pointer_ty.kind() {
match self.structurally_resolve_type(self.tcx.hir().span(var_hir_id), pointer_ty).kind()
{
// We don't capture derefs of raw ptrs
ty::RawPtr(_, _) => unreachable!(),
@ -1816,7 +1817,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Dereferencing a box doesn't change mutability
ty::Adt(def, ..) if def.is_box() => {}
unexpected_ty => bug!("deref of unexpected pointer type {:?}", unexpected_ty),
unexpected_ty => span_bug!(
self.tcx.hir().span(var_hir_id),
"deref of unexpected pointer type {:?}",
unexpected_ty
),
}
}

View File

@ -0,0 +1,20 @@
//@ check-pass
//@ compile-flags: -Znext-solver
trait Mirror {
type Assoc;
}
impl<T> Mirror for T {
type Assoc = T;
}
struct Place {
field: <&'static [u8] as Mirror>::Assoc,
}
fn main() {
let local = Place { field: &[] };
let z = || {
let y = &local.field[0];
};
}