Skip to content

Commit

Permalink
Structurally resolve before matching on type of projection
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Nov 27, 2024
1 parent f2abf82 commit 48b2bbd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
9 changes: 7 additions & 2 deletions compiler/rustc_hir_typeck/src/upvar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!(),

Expand All @@ -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
),
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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];
};
}

0 comments on commit 48b2bbd

Please sign in to comment.