mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Do normalize when computing struct tails in codegen
This commit is contained in:
parent
d3a393932e
commit
85b5e42d5e
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user