@@ -5,7 +5,6 @@ use rustc_middle::mir;
55use rustc_middle:: mir:: interpret:: { EvalToValTreeResult , GlobalId } ;
66use rustc_middle:: ty:: { self , TyCtxt } ;
77use rustc_span:: { source_map:: DUMMY_SP , symbol:: Symbol } ;
8- use rustc_target:: abi:: VariantIdx ;
98
109use crate :: interpret:: {
1110 intern_const_alloc_recursive, ConstValue , InternKind , InterpCx , InterpResult , MemPlaceMeta ,
@@ -91,83 +90,6 @@ pub(crate) fn eval_to_valtree<'tcx>(
9190 }
9291}
9392
94- /// Tries to destructure constants of type Array or Adt into the constants
95- /// of its fields.
96- pub ( crate ) fn try_destructure_const < ' tcx > (
97- tcx : TyCtxt < ' tcx > ,
98- const_ : ty:: Const < ' tcx > ,
99- ) -> Option < ty:: DestructuredConst < ' tcx > > {
100- if let ty:: ConstKind :: Value ( valtree) = const_. kind ( ) {
101- let branches = match valtree {
102- ty:: ValTree :: Branch ( b) => b,
103- _ => return None ,
104- } ;
105-
106- let ( fields, variant) = match const_. ty ( ) . kind ( ) {
107- ty:: Array ( inner_ty, _) | ty:: Slice ( inner_ty) => {
108- // construct the consts for the elements of the array/slice
109- let field_consts = branches
110- . iter ( )
111- . map ( |b| {
112- tcx. mk_const ( ty:: ConstS { kind : ty:: ConstKind :: Value ( * b) , ty : * inner_ty } )
113- } )
114- . collect :: < Vec < _ > > ( ) ;
115- debug ! ( ?field_consts) ;
116-
117- ( field_consts, None )
118- }
119- ty:: Adt ( def, _) if def. variants ( ) . is_empty ( ) => bug ! ( "unreachable" ) ,
120- ty:: Adt ( def, substs) => {
121- let variant_idx = if def. is_enum ( ) {
122- VariantIdx :: from_u32 ( branches[ 0 ] . unwrap_leaf ( ) . try_to_u32 ( ) . ok ( ) ?)
123- } else {
124- VariantIdx :: from_u32 ( 0 )
125- } ;
126- let fields = & def. variant ( variant_idx) . fields ;
127- let mut field_consts = Vec :: with_capacity ( fields. len ( ) ) ;
128-
129- // Note: First element inValTree corresponds to variant of enum
130- let mut valtree_idx = if def. is_enum ( ) { 1 } else { 0 } ;
131- for field in fields {
132- let field_ty = field. ty ( tcx, substs) ;
133- let field_valtree = branches[ valtree_idx] ; // first element of branches is variant
134- let field_const = tcx. mk_const ( ty:: ConstS {
135- kind : ty:: ConstKind :: Value ( field_valtree) ,
136- ty : field_ty,
137- } ) ;
138- field_consts. push ( field_const) ;
139- valtree_idx += 1 ;
140- }
141- debug ! ( ?field_consts) ;
142-
143- ( field_consts, Some ( variant_idx) )
144- }
145- ty:: Tuple ( elem_tys) => {
146- let fields = elem_tys
147- . iter ( )
148- . enumerate ( )
149- . map ( |( i, elem_ty) | {
150- let elem_valtree = branches[ i] ;
151- tcx. mk_const ( ty:: ConstS {
152- kind : ty:: ConstKind :: Value ( elem_valtree) ,
153- ty : elem_ty,
154- } )
155- } )
156- . collect :: < Vec < _ > > ( ) ;
157-
158- ( fields, None )
159- }
160- _ => bug ! ( "cannot destructure constant {:?}" , const_) ,
161- } ;
162-
163- let fields = tcx. arena . alloc_from_iter ( fields. into_iter ( ) ) ;
164-
165- Some ( ty:: DestructuredConst { variant, fields } )
166- } else {
167- None
168- }
169- }
170-
17193#[ instrument( skip( tcx) , level = "debug" ) ]
17294pub ( crate ) fn try_destructure_mir_constant < ' tcx > (
17395 tcx : TyCtxt < ' tcx > ,
0 commit comments