@@ -17,6 +17,7 @@ use tracing::instrument;
1717
1818use  super :: errors:: { 
1919    InvalidAbi ,  InvalidAbiSuggestion ,  MisplacedRelaxTraitBound ,  TupleStructWithDefault , 
20+     UnionWithDefault , 
2021} ; 
2122use  super :: stability:: { enabled_names,  gate_unstable_abi} ; 
2223use  super :: { 
@@ -316,7 +317,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
316317                    ImplTraitContext :: Disallowed ( ImplTraitPosition :: Generic ) , 
317318                    |this| { 
318319                        this. arena . alloc_from_iter ( 
319-                             enum_definition. variants . iter ( ) . map ( |x| this. lower_variant ( x) ) , 
320+                             enum_definition. variants . iter ( ) . map ( |x| this. lower_variant ( i ,   x) ) , 
320321                        ) 
321322                    } , 
322323                ) ; 
@@ -328,7 +329,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
328329                    generics, 
329330                    id, 
330331                    ImplTraitContext :: Disallowed ( ImplTraitPosition :: Generic ) , 
331-                     |this| this. lower_variant_data ( hir_id,  struct_def) , 
332+                     |this| this. lower_variant_data ( hir_id,  i ,   struct_def) , 
332333                ) ; 
333334                hir:: ItemKind :: Struct ( ident,  generics,  struct_def) 
334335            } 
@@ -338,7 +339,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
338339                    generics, 
339340                    id, 
340341                    ImplTraitContext :: Disallowed ( ImplTraitPosition :: Generic ) , 
341-                     |this| this. lower_variant_data ( hir_id,  vdata) , 
342+                     |this| this. lower_variant_data ( hir_id,  i ,   vdata) , 
342343                ) ; 
343344                hir:: ItemKind :: Union ( ident,  generics,  vdata) 
344345            } 
@@ -714,13 +715,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
714715        } 
715716    } 
716717
717-     fn  lower_variant ( & mut  self ,  v :  & Variant )  -> hir:: Variant < ' hir >  { 
718+     fn  lower_variant ( & mut  self ,  item_kind :   & ItemKind ,   v :  & Variant )  -> hir:: Variant < ' hir >  { 
718719        let  hir_id = self . lower_node_id ( v. id ) ; 
719720        self . lower_attrs ( hir_id,  & v. attrs ,  v. span ) ; 
720721        hir:: Variant  { 
721722            hir_id, 
722723            def_id :  self . local_def_id ( v. id ) , 
723-             data :  self . lower_variant_data ( hir_id,  & v. data ) , 
724+             data :  self . lower_variant_data ( hir_id,  item_kind ,   & v. data ) , 
724725            disr_expr :  v. disr_expr . as_ref ( ) . map ( |e| self . lower_anon_const_to_anon_const ( e) ) , 
725726            ident :  self . lower_ident ( v. ident ) , 
726727            span :  self . lower_span ( v. span ) , 
@@ -730,15 +731,36 @@ impl<'hir> LoweringContext<'_, 'hir> {
730731    fn  lower_variant_data ( 
731732        & mut  self , 
732733        parent_id :  hir:: HirId , 
734+         item_kind :  & ItemKind , 
733735        vdata :  & VariantData , 
734736    )  -> hir:: VariantData < ' hir >  { 
735737        match  vdata { 
736-             VariantData :: Struct  {  fields,  recovered }  => hir :: VariantData :: Struct   { 
737-                 fields :  self 
738+             VariantData :: Struct  {  fields,  recovered }  => { 
739+                 let   fields =  self 
738740                    . arena 
739-                     . alloc_from_iter ( fields. iter ( ) . enumerate ( ) . map ( |f| self . lower_field_def ( f) ) ) , 
740-                 recovered :  * recovered, 
741-             } , 
741+                     . alloc_from_iter ( fields. iter ( ) . enumerate ( ) . map ( |f| self . lower_field_def ( f) ) ) ; 
742+ 
743+                 if  let  ItemKind :: Union ( ..)  = item_kind { 
744+                     for  field in  & fields[ ..]  { 
745+                         if  let  Some ( default)  = field. default  { 
746+                             // Unions cannot derive `Default`, and it's not clear how to use default 
747+                             // field values of unions if that was supported. Therefore, blanket reject 
748+                             // trying to use field values with unions. 
749+                             if  self . tcx . features ( ) . default_field_values ( )  { 
750+                                 self . dcx ( ) . emit_err ( UnionWithDefault  {  span :  default. span  } ) ; 
751+                             }  else  { 
752+                                 let  _ = self . dcx ( ) . span_delayed_bug ( 
753+                                 default. span , 
754+                                 "expected union default field values feature gate error but none \  
755+ , 
756+                             ) ; 
757+                             } 
758+                         } 
759+                     } 
760+                 } 
761+ 
762+                 hir:: VariantData :: Struct  {  fields,  recovered :  * recovered } 
763+             } 
742764            VariantData :: Tuple ( fields,  id)  => { 
743765                let  ctor_id = self . lower_node_id ( * id) ; 
744766                self . alias_attrs ( ctor_id,  parent_id) ; 
0 commit comments