Rollup merge of #136430 - FedericoBruzzone:follow-up-136180, r=oli-obk
Use the type-level constant value `ty::Value` where needed **Follow-up to #136180** ### Summary This PR refactors functions to accept a single type-level constant value `ty::Value` instead of separate `ty::ValTree` and `ty::Ty` parameters: - `valtree_to_const_value`: now takes `ty::Value` - `pretty_print_const_valtree`: now takes `ty::Value` - Uses `pretty_print_const_valtree` for formatting valtrees when `visit_const_operand` - Moves `try_to_raw_bytes` from `ty::Valtree` to `ty::Value` --- r? ``@lukas-code`` ``@oli-obk``
This commit is contained in:
commit
7e0118cdd2
7 changed files with 79 additions and 78 deletions
|
@ -273,59 +273,63 @@ pub(crate) fn eval_to_valtree<'tcx>(
|
|||
/// Converts a `ValTree` to a `ConstValue`, which is needed after mir
|
||||
/// construction has finished.
|
||||
// FIXME(valtrees): Merge `valtree_to_const_value` and `valtree_into_mplace` into one function
|
||||
// FIXME(valtrees): Accept `ty::Value` instead of `Ty` and `ty::ValTree` separately.
|
||||
#[instrument(skip(tcx), level = "debug", ret)]
|
||||
pub fn valtree_to_const_value<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
valtree: ty::ValTree<'tcx>,
|
||||
cv: ty::Value<'tcx>,
|
||||
) -> mir::ConstValue<'tcx> {
|
||||
// Basic idea: We directly construct `Scalar` values from trivial `ValTree`s
|
||||
// (those for constants with type bool, int, uint, float or char).
|
||||
// For all other types we create an `MPlace` and fill that by walking
|
||||
// the `ValTree` and using `place_projection` and `place_field` to
|
||||
// create inner `MPlace`s which are filled recursively.
|
||||
// FIXME Does this need an example?
|
||||
match *ty.kind() {
|
||||
// FIXME: Does this need an example?
|
||||
match *cv.ty.kind() {
|
||||
ty::FnDef(..) => {
|
||||
assert!(valtree.unwrap_branch().is_empty());
|
||||
assert!(cv.valtree.unwrap_branch().is_empty());
|
||||
mir::ConstValue::ZeroSized
|
||||
}
|
||||
ty::Bool | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Char | ty::RawPtr(_, _) => {
|
||||
match valtree {
|
||||
match cv.valtree {
|
||||
ty::ValTree::Leaf(scalar_int) => mir::ConstValue::Scalar(Scalar::Int(scalar_int)),
|
||||
ty::ValTree::Branch(_) => bug!(
|
||||
"ValTrees for Bool, Int, Uint, Float, Char or RawPtr should have the form ValTree::Leaf"
|
||||
),
|
||||
}
|
||||
}
|
||||
ty::Pat(ty, _) => valtree_to_const_value(tcx, typing_env, ty, valtree),
|
||||
ty::Pat(ty, _) => {
|
||||
let cv = ty::Value { valtree: cv.valtree, ty };
|
||||
valtree_to_const_value(tcx, typing_env, cv)
|
||||
}
|
||||
ty::Ref(_, inner_ty, _) => {
|
||||
let mut ecx =
|
||||
mk_eval_cx_to_read_const_val(tcx, DUMMY_SP, typing_env, CanAccessMutGlobal::No);
|
||||
let imm = valtree_to_ref(&mut ecx, valtree, inner_ty);
|
||||
let imm =
|
||||
ImmTy::from_immediate(imm, tcx.layout_of(typing_env.as_query_input(ty)).unwrap());
|
||||
let imm = valtree_to_ref(&mut ecx, cv.valtree, inner_ty);
|
||||
let imm = ImmTy::from_immediate(
|
||||
imm,
|
||||
tcx.layout_of(typing_env.as_query_input(cv.ty)).unwrap(),
|
||||
);
|
||||
op_to_const(&ecx, &imm.into(), /* for diagnostics */ false)
|
||||
}
|
||||
ty::Tuple(_) | ty::Array(_, _) | ty::Adt(..) => {
|
||||
let layout = tcx.layout_of(typing_env.as_query_input(ty)).unwrap();
|
||||
let layout = tcx.layout_of(typing_env.as_query_input(cv.ty)).unwrap();
|
||||
if layout.is_zst() {
|
||||
// Fast path to avoid some allocations.
|
||||
return mir::ConstValue::ZeroSized;
|
||||
}
|
||||
if layout.backend_repr.is_scalar()
|
||||
&& (matches!(ty.kind(), ty::Tuple(_))
|
||||
|| matches!(ty.kind(), ty::Adt(def, _) if def.is_struct()))
|
||||
&& (matches!(cv.ty.kind(), ty::Tuple(_))
|
||||
|| matches!(cv.ty.kind(), ty::Adt(def, _) if def.is_struct()))
|
||||
{
|
||||
// A Scalar tuple/struct; we can avoid creating an allocation.
|
||||
let branches = valtree.unwrap_branch();
|
||||
let branches = cv.valtree.unwrap_branch();
|
||||
// Find the non-ZST field. (There can be aligned ZST!)
|
||||
for (i, &inner_valtree) in branches.iter().enumerate() {
|
||||
let field = layout.field(&LayoutCx::new(tcx, typing_env), i);
|
||||
if !field.is_zst() {
|
||||
return valtree_to_const_value(tcx, typing_env, field.ty, inner_valtree);
|
||||
let cv = ty::Value { valtree: inner_valtree, ty: field.ty };
|
||||
return valtree_to_const_value(tcx, typing_env, cv);
|
||||
}
|
||||
}
|
||||
bug!("could not find non-ZST field during in {layout:#?}");
|
||||
|
@ -335,9 +339,9 @@ pub fn valtree_to_const_value<'tcx>(
|
|||
mk_eval_cx_to_read_const_val(tcx, DUMMY_SP, typing_env, CanAccessMutGlobal::No);
|
||||
|
||||
// Need to create a place for this valtree.
|
||||
let place = create_valtree_place(&mut ecx, layout, valtree);
|
||||
let place = create_valtree_place(&mut ecx, layout, cv.valtree);
|
||||
|
||||
valtree_into_mplace(&mut ecx, &place, valtree);
|
||||
valtree_into_mplace(&mut ecx, &place, cv.valtree);
|
||||
dump_place(&ecx, &place);
|
||||
intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &place).unwrap();
|
||||
|
||||
|
@ -362,7 +366,7 @@ pub fn valtree_to_const_value<'tcx>(
|
|||
| ty::Slice(_)
|
||||
| ty::Dynamic(..)
|
||||
| ty::UnsafeBinder(_) => {
|
||||
bug!("no ValTree should have been created for type {:?}", ty.kind())
|
||||
bug!("no ValTree should have been created for type {:?}", cv.ty.kind())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,14 +46,8 @@ pub fn provide(providers: &mut Providers) {
|
|||
};
|
||||
providers.hooks.try_destructure_mir_constant_for_user_output =
|
||||
const_eval::try_destructure_mir_constant_for_user_output;
|
||||
providers.valtree_to_const_val = |tcx, cv| {
|
||||
const_eval::valtree_to_const_value(
|
||||
tcx,
|
||||
ty::TypingEnv::fully_monomorphized(),
|
||||
cv.ty,
|
||||
cv.valtree,
|
||||
)
|
||||
};
|
||||
providers.valtree_to_const_val =
|
||||
|tcx, cv| const_eval::valtree_to_const_value(tcx, ty::TypingEnv::fully_monomorphized(), cv);
|
||||
providers.check_validity_requirement = |tcx, (init_kind, param_env_and_ty)| {
|
||||
util::check_validity_requirement(tcx, init_kind, param_env_and_ty)
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue