tag_for_variant: properly pass TypingEnv

This commit is contained in:
Ralf Jung
2025-06-27 17:02:47 +02:00
parent e61dd437f3
commit 5af79242ac
3 changed files with 8 additions and 11 deletions
@@ -67,18 +67,13 @@ pub(crate) fn try_destructure_mir_constant_for_user_output<'tcx>(
#[instrument(skip(tcx), level = "debug")]
pub fn tag_for_variant_provider<'tcx>(
tcx: TyCtxt<'tcx>,
(ty, variant_index): (Ty<'tcx>, VariantIdx),
key: ty::PseudoCanonicalInput<'tcx, (Ty<'tcx>, VariantIdx)>,
) -> Option<ty::ScalarInt> {
let (ty, variant_index) = key.value;
assert!(ty.is_enum());
// FIXME: This uses an empty `TypingEnv` even though
// it may be used by a generic CTFE.
let ecx = InterpCx::new(
tcx,
ty.default_span(tcx),
ty::TypingEnv::fully_monomorphized(),
crate::const_eval::DummyMachine,
);
let ecx =
InterpCx::new(tcx, ty.default_span(tcx), key.typing_env, crate::const_eval::DummyMachine);
let layout = ecx.layout_of(ty).unwrap();
ecx.tag_for_variant(layout, variant_index).unwrap().map(|(tag, _tag_field)| tag)
+1 -1
View File
@@ -1311,7 +1311,7 @@
///
/// This query will panic for uninhabited variants and if the passed type is not an enum.
query tag_for_variant(
key: (Ty<'tcx>, abi::VariantIdx)
key: PseudoCanonicalInput<'tcx, (Ty<'tcx>, abi::VariantIdx)>,
) -> Option<ty::ScalarInt> {
desc { "computing variant tag for enum" }
}
+3 -1
View File
@@ -432,7 +432,9 @@ fn from_enum(
if variant_layout.is_uninhabited() {
return Ok(Self::uninhabited());
}
let tag = cx.tcx().tag_for_variant((cx.tcx().erase_regions(ty), index));
let tag = cx.tcx().tag_for_variant(
cx.typing_env.as_query_input((cx.tcx().erase_regions(ty), index)),
);
let variant_def = Def::Variant(def.variant(index));
Self::from_variant(
variant_def,