@@ -1352,22 +1352,19 @@ impl<'a, 'tcx> LayoutDetails {
1352
1352
} ) . collect :: < Result < Vec < _ > , _ > > ( )
1353
1353
} ) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
1354
1354
1355
- let ( inh_first, inh_second) = {
1356
- let mut inh_variants = ( 0 ..variants. len ( ) ) . filter ( |& v| {
1357
- variants[ v] . iter ( ) . all ( |f| f. abi != Abi :: Uninhabited )
1358
- } ) ;
1359
- ( inh_variants. next ( ) , inh_variants. next ( ) )
1360
- } ;
1361
- if inh_first. is_none ( ) {
1362
- // Uninhabited because it has no variants, or only uninhabited ones.
1363
- return Ok ( tcx. intern_layout ( LayoutDetails :: uninhabited ( 0 ) ) ) ;
1364
- }
1365
-
1366
1355
if def. is_union ( ) {
1367
1356
let packed = def. repr . packed ( ) ;
1368
1357
if packed && def. repr . align > 0 {
1369
1358
bug ! ( "Union cannot be packed and aligned" ) ;
1370
1359
}
1360
+ if variants. len ( ) != 1 {
1361
+ bug ! ( "Union must be represented as a single variant" ) ;
1362
+ }
1363
+
1364
+ if variants[ 0 ] . iter ( ) . all ( |f| f. abi == Abi :: Uninhabited ) {
1365
+ // Uninhabited because it has only uninhabited variants/fields.
1366
+ return Ok ( tcx. intern_layout ( LayoutDetails :: uninhabited ( 0 ) ) ) ;
1367
+ }
1371
1368
1372
1369
let mut align = if def. repr . packed ( ) {
1373
1370
dl. i8_align
@@ -1400,6 +1397,17 @@ impl<'a, 'tcx> LayoutDetails {
1400
1397
} ) ) ;
1401
1398
}
1402
1399
1400
+ let ( inh_first, inh_second) = {
1401
+ let mut inh_variants = ( 0 ..variants. len ( ) ) . filter ( |& v| {
1402
+ variants[ v] . iter ( ) . all ( |f| f. abi != Abi :: Uninhabited )
1403
+ } ) ;
1404
+ ( inh_variants. next ( ) , inh_variants. next ( ) )
1405
+ } ;
1406
+ if inh_first. is_none ( ) {
1407
+ // Uninhabited because it has no variants, or only uninhabited ones.
1408
+ return Ok ( tcx. intern_layout ( LayoutDetails :: uninhabited ( 0 ) ) ) ;
1409
+ }
1410
+
1403
1411
let is_struct = !def. is_enum ( ) ||
1404
1412
// Only one variant is inhabited.
1405
1413
( inh_second. is_none ( ) &&
0 commit comments