Do normalize when computing struct tails in codegen

This commit is contained in:
Michael Goulet 2024-08-05 15:25:40 -04:00
parent d3a393932e
commit 85b5e42d5e
2 changed files with 4 additions and 3 deletions

View File

@ -12,7 +12,8 @@ use rustc_data_structures::small_c_str::SmallCStr;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
use rustc_middle::ty::layout::{ use rustc_middle::ty::layout::{
FnAbiError, FnAbiOfHelpers, FnAbiRequest, LayoutError, LayoutOfHelpers, TyAndLayout, FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, LayoutError, LayoutOfHelpers,
TyAndLayout,
}; };
use rustc_middle::ty::{self, Instance, Ty, TyCtxt}; use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
use rustc_sanitizers::{cfi, kcfi}; use rustc_sanitizers::{cfi, kcfi};
@ -531,7 +532,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
#[instrument(level = "trace", skip(self))] #[instrument(level = "trace", skip(self))]
fn load_operand(&mut self, place: PlaceRef<'tcx, &'ll Value>) -> OperandRef<'tcx, &'ll Value> { fn load_operand(&mut self, place: PlaceRef<'tcx, &'ll Value>) -> OperandRef<'tcx, &'ll Value> {
if place.layout.is_unsized() { if place.layout.is_unsized() {
let tail = self.tcx.struct_tail_with_normalize(place.layout.ty, |ty| ty, || {}); let tail = self.tcx.struct_tail_erasing_lifetimes(place.layout.ty, self.param_env());
if matches!(tail.kind(), ty::Foreign(..)) { if matches!(tail.kind(), ty::Foreign(..)) {
// Unsized locals and, at least conceptually, even unsized arguments must be copied // Unsized locals and, at least conceptually, even unsized arguments must be copied
// around, which requires dynamically determining their size. Therefore, we cannot // around, which requires dynamically determining their size. Therefore, we cannot

View File

@ -549,7 +549,7 @@ fn fn_abi_sanity_check<'tcx>(
// With metadata. Must be unsized and not on the stack. // With metadata. Must be unsized and not on the stack.
assert!(arg.layout.is_unsized() && !on_stack); assert!(arg.layout.is_unsized() && !on_stack);
// Also, must not be `extern` type. // Also, must not be `extern` type.
let tail = cx.tcx.struct_tail_with_normalize(arg.layout.ty, |ty| ty, || {}); let tail = cx.tcx.struct_tail_erasing_lifetimes(arg.layout.ty, cx.param_env());
if matches!(tail.kind(), ty::Foreign(..)) { if matches!(tail.kind(), ty::Foreign(..)) {
// These types do not have metadata, so having `meta_attrs` is bogus. // These types do not have metadata, so having `meta_attrs` is bogus.
// Conceptually, unsized arguments must be copied around, which requires dynamically // Conceptually, unsized arguments must be copied around, which requires dynamically