@@ -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+ was produced",
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