@@ -606,13 +606,22 @@ fn create_enum_md(cx: &mut CrateContext,
606
606
return discriminant_type_md;
607
607
}
608
608
609
+ let is_univariant = variants. len ( ) == 1 ;
610
+
609
611
let variants_md = do variants. map |& vi| {
610
612
611
613
let raw_types : & [ ty:: t ] = vi. args ;
612
614
let arg_types = do raw_types. map |& raw_type| { ty:: subst ( cx. tcx , substs, raw_type) } ;
613
- let arg_llvm_types = ~[ discriminant_llvm_type] + do arg_types. map |& ty| { type_of:: type_of ( cx, ty) } ;
614
- let arg_names = ~[ ~""] + arg_types. map ( |_| ~"") ;
615
- let arg_md = ~[ discriminant_type_md] + do arg_types. map |& ty| { get_or_create_type ( cx, ty, span) } ;
615
+
616
+ let mut arg_llvm_types = do arg_types. map |& ty| { type_of:: type_of ( cx, ty) } ;
617
+ let mut arg_names = arg_types. map ( |_| ~"") ;
618
+ let mut arg_md = do arg_types. map |& ty| { get_or_create_type ( cx, ty, span) } ;
619
+
620
+ if !is_univariant {
621
+ arg_llvm_types. insert ( 0 , discriminant_llvm_type) ;
622
+ arg_names. insert ( 0 , ~"") ;
623
+ arg_md. insert ( 0 , discriminant_type_md) ;
624
+ }
616
625
617
626
let variant_llvm_type = Type :: struct_ ( arg_llvm_types, false ) ;
618
627
let variant_type_size = machine:: llsize_of_alloc ( cx, variant_llvm_type) ;
@@ -646,7 +655,7 @@ fn create_enum_md(cx: &mut CrateContext,
646
655
let enum_type_size = machine:: llsize_of_alloc ( cx, enum_llvm_type) ;
647
656
let enum_type_align = machine:: llalign_of_min ( cx, enum_llvm_type) ;
648
657
649
- return do "" . as_c_str |enum_name| { unsafe { llvm:: LLVMDIBuilderCreateUnionType (
658
+ return do enum_name . as_c_str |enum_name| { unsafe { llvm:: LLVMDIBuilderCreateUnionType (
650
659
DIB ( cx) ,
651
660
file_metadata,
652
661
enum_name,
0 commit comments