@@ -244,13 +244,24 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> {
244244        } ; 
245245
246246        // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types. 
247+         // Bools in union fields needs to be truncated. 
248+         let  to_immediate_or_cast = |bx :  & mut  Bx ,  val,  ty| { 
249+             if  ty == bx. cx ( ) . type_i1 ( )  { 
250+                 bx. trunc ( val,  ty) 
251+             }  else  { 
252+                 bx. bitcast ( val,  ty) 
253+             } 
254+         } ; 
255+ 
247256        match  val { 
248257            OperandValue :: Immediate ( ref  mut  llval)  => { 
249-                 * llval = bx . bitcast ( * llval,  bx. cx ( ) . immediate_backend_type ( field) ) ; 
258+                 * llval = to_immediate_or_cast ( bx ,   * llval,  bx. cx ( ) . immediate_backend_type ( field) ) ; 
250259            } 
251260            OperandValue :: Pair ( ref  mut  a,  ref  mut  b)  => { 
252-                 * a = bx. bitcast ( * a,  bx. cx ( ) . scalar_pair_element_backend_type ( field,  0 ,  true ) ) ; 
253-                 * b = bx. bitcast ( * b,  bx. cx ( ) . scalar_pair_element_backend_type ( field,  1 ,  true ) ) ; 
261+                 * a = to_immediate_or_cast ( bx,  * a,  bx. cx ( ) 
262+                     . scalar_pair_element_backend_type ( field,  0 ,  true ) ) ; 
263+                 * b = to_immediate_or_cast ( bx,  * b,  bx. cx ( ) 
264+                     . scalar_pair_element_backend_type ( field,  1 ,  true ) ) ; 
254265            } 
255266            OperandValue :: Ref ( ..)  => bug ! ( ) 
256267        } 
0 commit comments