@@ -331,30 +331,32 @@ pub(crate) mod rustc {
331331 assert ! ( def. is_enum( ) ) ;
332332 let layout = ty_and_layout. layout ;
333333
334- if let Variants :: Multiple { tag_field, .. } = layout. variants ( ) {
335- // For enums (but not coroutines), the tag field is
336- // currently always the first field of the layout.
337- assert_eq ! ( * tag_field, 0 ) ;
338- }
334+ // Computes the variant of a given index.
335+ let layout_of_variant = |index| {
336+ let tag = cx. tcx . tag_for_variant ( ( ty_and_layout. ty , index) ) ;
337+ let variant_def = Def :: Variant ( def. variant ( index) ) ;
338+ let variant_ty_and_layout = ty_and_layout. for_variant ( & cx, index) ;
339+ Self :: from_variant ( variant_def, tag, variant_ty_and_layout, layout. size , cx)
340+ } ;
339341
340- let variants = def. discriminants ( cx. tcx ( ) ) . try_fold (
341- Self :: uninhabited ( ) ,
342- |variants, ( idx, ref discriminant) | {
343- let tag = cx. tcx . tag_for_variant ( ( ty_and_layout. ty , idx) ) ;
344- let variant_def = Def :: Variant ( def. variant ( idx) ) ;
345- let variant_ty_and_layout = ty_and_layout. for_variant ( & cx, idx) ;
346- let variant = Self :: from_variant (
347- variant_def,
348- tag,
349- variant_ty_and_layout,
350- layout. size ,
351- cx,
342+ match layout. variants ( ) {
343+ Variants :: Single { index } => layout_of_variant ( * index) ,
344+ Variants :: Multiple { tag_field, .. } => {
345+ // For enums (but not coroutines), the tag field is
346+ // currently always the first field of the layout.
347+ assert_eq ! ( * tag_field, 0 ) ;
348+
349+ let variants = def. discriminants ( cx. tcx ( ) ) . try_fold (
350+ Self :: uninhabited ( ) ,
351+ |variants, ( idx, ref discriminant) | {
352+ let variant = layout_of_variant ( idx) ?;
353+ Result :: < Self , Err > :: Ok ( variants. or ( variant) )
354+ } ,
352355 ) ?;
353- Result :: < Self , Err > :: Ok ( variants. or ( variant) )
354- } ,
355- ) ?;
356356
357- return Ok ( Self :: def ( Def :: Adt ( def) ) . then ( variants) ) ;
357+ return Ok ( Self :: def ( Def :: Adt ( def) ) . then ( variants) ) ;
358+ }
359+ }
358360 }
359361
360362 /// Constructs a `Tree` from a 'variant-like' layout.
0 commit comments