diff options
Diffstat (limited to 'compiler/rustc_transmute/src/lib.rs')
| -rw-r--r-- | compiler/rustc_transmute/src/lib.rs | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/compiler/rustc_transmute/src/lib.rs b/compiler/rustc_transmute/src/lib.rs index ad86813c87e..f9537f708ef 100644 --- a/compiler/rustc_transmute/src/lib.rs +++ b/compiler/rustc_transmute/src/lib.rs @@ -84,7 +84,7 @@ mod rustc { use rustc_infer::infer::InferCtxt; use rustc_macros::TypeVisitable; use rustc_middle::traits::ObligationCause; - use rustc_middle::ty::{Const, ParamEnv, Ty, TyCtxt, ValTree}; + use rustc_middle::ty::{Const, ParamEnv, Ty, TyCtxt}; use super::*; @@ -128,36 +128,32 @@ mod rustc { pub fn from_const<'tcx>( tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>, - c: Const<'tcx>, + ct: Const<'tcx>, ) -> Option<Self> { use rustc_middle::ty::ScalarInt; use rustc_span::sym; - let Some((cv, ty)) = c.try_to_valtree() else { + let Some(cv) = ct.try_to_value() else { return None; }; - let adt_def = ty.ty_adt_def()?; - - assert_eq!( - tcx.require_lang_item(LangItem::TransmuteOpts, None), - adt_def.did(), - "The given `Const` was not marked with the `{}` lang item.", - LangItem::TransmuteOpts.name(), - ); + let adt_def = cv.ty.ty_adt_def()?; + + if !tcx.is_lang_item(adt_def.did(), LangItem::TransmuteOpts) { + tcx.dcx().delayed_bug(format!( + "The given `const` was not marked with the `{}` lang item.", + LangItem::TransmuteOpts.name() + )); + return Some(Self { + alignment: true, + lifetimes: true, + safety: true, + validity: true, + }); + } let variant = adt_def.non_enum_variant(); - let fields = match cv { - ValTree::Branch(branch) => branch, - _ => { - return Some(Self { - alignment: true, - lifetimes: true, - safety: true, - validity: true, - }); - } - }; + let fields = cv.valtree.unwrap_branch(); let get_field = |name| { let (field_idx, _) = variant |
