@@ -331,30 +331,32 @@ pub(crate) mod rustc {
331
331
assert ! ( def. is_enum( ) ) ;
332
332
let layout = ty_and_layout. layout ;
333
333
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
+ } ;
339
341
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
+ } ,
352
355
) ?;
353
- Result :: < Self , Err > :: Ok ( variants. or ( variant) )
354
- } ,
355
- ) ?;
356
356
357
- return Ok ( Self :: def ( Def :: Adt ( def) ) . then ( variants) ) ;
357
+ return Ok ( Self :: def ( Def :: Adt ( def) ) . then ( variants) ) ;
358
+ }
359
+ }
358
360
}
359
361
360
362
/// Constructs a `Tree` from a 'variant-like' layout.
0 commit comments