This commit is contained in:
DrMeepster 2023-04-16 14:44:09 -07:00
parent 631ea7cc15
commit 2bcb018253
3 changed files with 12 additions and 13 deletions

View file

@ -255,16 +255,13 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
self.insert_def_id(field.did);
let field_ty = field.ty(self.tcx, subst);
current_ty =
self.tcx.normalize_erasing_regions(param_env, field_ty);
current_ty = self.tcx.normalize_erasing_regions(param_env, field_ty);
}
// we don't need to mark tuple fields as live,
// but we may need to mark subfields
ty::Tuple(tys) => {
current_ty = self.tcx.normalize_erasing_regions(
param_env,
tys[index.as_usize()],
);
current_ty =
self.tcx.normalize_erasing_regions(param_env, tys[index.as_usize()]);
}
_ => span_bug!(expr.span, "named field access on non-ADT"),
}

View file

@ -458,4 +458,4 @@ fn offset_of_addr() {
assert_eq!(ptr::addr_of!(base).addr() + offset_of!(Foo, y), ptr::addr_of!(base.y).addr());
assert_eq!(ptr::addr_of!(base).addr() + offset_of!(Foo, z.0), ptr::addr_of!(base.z.0).addr());
assert_eq!(ptr::addr_of!(base).addr() + offset_of!(Foo, z.1), ptr::addr_of!(base.z.1).addr());
}
}

View file

@ -27,14 +27,16 @@ fn test<T>() -> usize
where
GenericIsEqual<T>: Project<EquateParamTo = MyFieldIsNotDead>,
{
// The first field of the A that we construct here is `<GenericIsEqual<T>> as Project>::EquateParamTo`.
// Typeck normalizes this and figures that the not_dead field is totally fine and accessible.
// But importantly, the normalization ends up with T, which, as we've declared in our param env is MyFieldDead.
// When we're in the param env of the `a` field, the where bound above is not in scope, so we don't know what T is - it's generic.
// We cannot access a field on T. Boom!
// The first field of the A that we construct here is
// `<GenericIsEqual<T>> as Project>::EquateParamTo`.
// Typeck normalizes this and figures that the not_dead field is totally fine and accessible.
// But importantly, the normalization ends up with T, which, as we've declared in our param
// env is MyFieldDead. When we're in the param env of the `a` field, the where bound above
// is not in scope, so we don't know what T is - it's generic.
// We cannot access a field on T. Boom!
std::mem::offset_of!(A<GenericIsEqual<T>>, a.not_dead)
}
fn main() {
test::<MyFieldIsNotDead>();
}
}