mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
tag_for_variant: properly pass TypingEnv
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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" }
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user