Rollup merge of #130644 - compiler-errors:consts-in-codegen, r=BoxyUwU
Only expect valtree consts in codegen Turn a bunch of `Const::eval_*` calls into `Const::try_to_*` calls, which implicitly assert that we only have valtrees by the time we get to codegen. r? `@BoxyUwU`
This commit is contained in:
commit
ff6cd18a75
@ -785,8 +785,10 @@ fn is_fat_ptr<'tcx>(fx: &FunctionCx<'_, '_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
||||
}
|
||||
Rvalue::Repeat(ref operand, times) => {
|
||||
let operand = codegen_operand(fx, operand);
|
||||
let times =
|
||||
fx.monomorphize(times).eval_target_usize(fx.tcx, ParamEnv::reveal_all());
|
||||
let times = fx
|
||||
.monomorphize(times)
|
||||
.try_to_target_usize(fx.tcx)
|
||||
.expect("expected monomorphic const in codegen");
|
||||
if operand.layout().size.bytes() == 0 {
|
||||
// Do nothing for ZST's
|
||||
} else if fx.clif_type(operand.layout().ty) == Some(types::I8) {
|
||||
@ -944,7 +946,10 @@ fn is_fat_ptr<'tcx>(fx: &FunctionCx<'_, '_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
||||
fn codegen_array_len<'tcx>(fx: &mut FunctionCx<'_, '_, 'tcx>, place: CPlace<'tcx>) -> Value {
|
||||
match *place.layout().ty.kind() {
|
||||
ty::Array(_elem_ty, len) => {
|
||||
let len = fx.monomorphize(len).eval_target_usize(fx.tcx, ParamEnv::reveal_all()) as i64;
|
||||
let len = fx
|
||||
.monomorphize(len)
|
||||
.try_to_target_usize(fx.tcx)
|
||||
.expect("expected monomorphic const in codegen") as i64;
|
||||
fx.bcx.ins().iconst(fx.pointer_type, len)
|
||||
}
|
||||
ty::Slice(_elem_ty) => place.to_ptr_unsized().1,
|
||||
|
@ -44,7 +44,7 @@ pub(crate) fn debug_type<'tcx>(
|
||||
type_dbg,
|
||||
ty,
|
||||
*elem_ty,
|
||||
len.eval_target_usize(tcx, ty::ParamEnv::reveal_all()),
|
||||
len.try_to_target_usize(tcx).expect("expected monomorphic const in codegen"),
|
||||
),
|
||||
// ty::Slice(_) | ty::Str
|
||||
// ty::Dynamic
|
||||
|
@ -131,9 +131,8 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
||||
|
||||
let idx = generic_args[2]
|
||||
.expect_const()
|
||||
.eval(fx.tcx, ty::ParamEnv::reveal_all(), span)
|
||||
.unwrap()
|
||||
.1
|
||||
.try_to_valtree()
|
||||
.expect("expected monomorphic const in codegen")
|
||||
.unwrap_branch();
|
||||
|
||||
assert_eq!(x.layout(), y.layout());
|
||||
|
@ -24,10 +24,10 @@ pub(crate) fn unsized_info<'tcx>(
|
||||
let (source, target) =
|
||||
fx.tcx.struct_lockstep_tails_for_codegen(source, target, ParamEnv::reveal_all());
|
||||
match (&source.kind(), &target.kind()) {
|
||||
(&ty::Array(_, len), &ty::Slice(_)) => fx
|
||||
.bcx
|
||||
.ins()
|
||||
.iconst(fx.pointer_type, len.eval_target_usize(fx.tcx, ParamEnv::reveal_all()) as i64),
|
||||
(&ty::Array(_, len), &ty::Slice(_)) => fx.bcx.ins().iconst(
|
||||
fx.pointer_type,
|
||||
len.try_to_target_usize(fx.tcx).expect("expected monomorphic const in codegen") as i64,
|
||||
),
|
||||
(&ty::Dynamic(data_a, _, src_dyn_kind), &ty::Dynamic(data_b, _, target_dyn_kind))
|
||||
if src_dyn_kind == target_dyn_kind =>
|
||||
{
|
||||
|
@ -125,7 +125,9 @@ fn build_fixed_size_array_di_node<'ll, 'tcx>(
|
||||
|
||||
let (size, align) = cx.size_and_align_of(array_type);
|
||||
|
||||
let upper_bound = len.eval_target_usize(cx.tcx, ty::ParamEnv::reveal_all()) as c_longlong;
|
||||
let upper_bound = len
|
||||
.try_to_target_usize(cx.tcx)
|
||||
.expect("expected monomorphic const in codegen") as c_longlong;
|
||||
|
||||
let subrange =
|
||||
unsafe { Some(llvm::LLVMRustDIBuilderGetOrCreateSubrange(DIB(cx), 0, upper_bound)) };
|
||||
|
@ -115,9 +115,9 @@ fn unsized_info<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||
let (source, target) =
|
||||
cx.tcx().struct_lockstep_tails_for_codegen(source, target, bx.param_env());
|
||||
match (source.kind(), target.kind()) {
|
||||
(&ty::Array(_, len), &ty::Slice(_)) => {
|
||||
cx.const_usize(len.eval_target_usize(cx.tcx(), ty::ParamEnv::reveal_all()))
|
||||
}
|
||||
(&ty::Array(_, len), &ty::Slice(_)) => cx.const_usize(
|
||||
len.try_to_target_usize(cx.tcx()).expect("expected monomorphic const in codegen"),
|
||||
),
|
||||
(&ty::Dynamic(data_a, _, src_dyn_kind), &ty::Dynamic(data_b, _, target_dyn_kind))
|
||||
if src_dyn_kind == target_dyn_kind =>
|
||||
{
|
||||
|
@ -188,7 +188,8 @@ fn push_debuginfo_type_name<'tcx>(
|
||||
_ => write!(
|
||||
output,
|
||||
",{}>",
|
||||
len.eval_target_usize(tcx, ty::ParamEnv::reveal_all())
|
||||
len.try_to_target_usize(tcx)
|
||||
.expect("expected monomorphic const in codegen")
|
||||
)
|
||||
.unwrap(),
|
||||
}
|
||||
@ -200,7 +201,8 @@ fn push_debuginfo_type_name<'tcx>(
|
||||
_ => write!(
|
||||
output,
|
||||
"; {}]",
|
||||
len.eval_target_usize(tcx, ty::ParamEnv::reveal_all())
|
||||
len.try_to_target_usize(tcx)
|
||||
.expect("expected monomorphic const in codegen")
|
||||
)
|
||||
.unwrap(),
|
||||
}
|
||||
|
@ -114,7 +114,8 @@ pub(crate) fn codegen_rvalue(
|
||||
|
||||
let count = self
|
||||
.monomorphize(count)
|
||||
.eval_target_usize(bx.cx().tcx(), ty::ParamEnv::reveal_all());
|
||||
.try_to_target_usize(bx.tcx())
|
||||
.expect("expected monomorphic const in codegen");
|
||||
|
||||
bx.write_operand_repeatedly(cg_elem, count, dest);
|
||||
}
|
||||
@ -803,7 +804,9 @@ fn evaluate_array_len(&mut self, bx: &mut Bx, place: mir::Place<'tcx>) -> Bx::Va
|
||||
if let Some(index) = place.as_local() {
|
||||
if let LocalRef::Operand(op) = self.locals[index] {
|
||||
if let ty::Array(_, n) = op.layout.ty.kind() {
|
||||
let n = n.eval_target_usize(bx.cx().tcx(), ty::ParamEnv::reveal_all());
|
||||
let n = n
|
||||
.try_to_target_usize(bx.tcx())
|
||||
.expect("expected monomorphic const in codegen");
|
||||
return bx.cx().const_usize(n);
|
||||
}
|
||||
}
|
||||
|
@ -521,6 +521,10 @@ pub fn try_to_scalar(self) -> Option<Scalar> {
|
||||
self.try_to_valtree()?.try_to_scalar()
|
||||
}
|
||||
|
||||
pub fn try_to_bool(self) -> Option<bool> {
|
||||
self.try_to_scalar()?.to_bool().ok()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn try_to_target_usize(self, tcx: TyCtxt<'tcx>) -> Option<u64> {
|
||||
self.try_to_valtree()?.try_to_target_usize(tcx)
|
||||
|
@ -145,7 +145,7 @@ fn encode_const<'tcx>(
|
||||
let _ = write!(s, "{val}");
|
||||
}
|
||||
ty::Bool => {
|
||||
let val = c.try_eval_bool(tcx, ty::ParamEnv::reveal_all()).unwrap();
|
||||
let val = c.try_to_bool().expect("expected monomorphic const in cfi");
|
||||
let _ = write!(s, "{val}");
|
||||
}
|
||||
_ => {
|
||||
@ -411,7 +411,7 @@ pub fn encode_ty<'tcx>(
|
||||
|
||||
ty::Array(ty0, len) => {
|
||||
// A<array-length><element-type>
|
||||
let len = len.eval_target_usize(tcx, ty::ParamEnv::reveal_all());
|
||||
let len = len.try_to_target_usize(tcx).expect("expected monomorphic const in cfi");
|
||||
let mut s = String::from("A");
|
||||
let _ = write!(s, "{len}");
|
||||
s.push_str(&encode_ty(tcx, *ty0, dict, options));
|
||||
|
@ -146,7 +146,10 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||
!is_zst
|
||||
});
|
||||
if let Some(field) = field {
|
||||
let ty0 = self.tcx.erase_regions(field.ty(self.tcx, args));
|
||||
let ty0 = self.tcx.normalize_erasing_regions(
|
||||
ty::ParamEnv::reveal_all(),
|
||||
field.ty(self.tcx, args),
|
||||
);
|
||||
// Generalize any repr(transparent) user-defined type that is either a
|
||||
// pointer or reference, and either references itself or any other type that
|
||||
// contains or references itself, to avoid a reference cycle.
|
||||
|
Loading…
Reference in New Issue
Block a user