@@ -2,6 +2,7 @@ use super::place::PlaceRef;
22use super :: { FunctionCx , LocalRef } ;
33
44use crate :: base;
5+ use crate :: common:: TypeKind ;
56use crate :: glue;
67use crate :: traits:: * ;
78use crate :: MemFlags ;
@@ -240,15 +241,24 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
240241 // Bools in union fields needs to be truncated.
241242 * llval = bx. to_immediate ( * llval, field) ;
242243 // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
243- * llval = bx. bitcast ( * llval, bx. cx ( ) . immediate_backend_type ( field) ) ;
244+ let ty = bx. cx ( ) . immediate_backend_type ( field) ;
245+ if bx. type_kind ( ty) == TypeKind :: Pointer {
246+ * llval = bx. pointercast ( * llval, ty) ;
247+ }
244248 }
245249 ( OperandValue :: Pair ( a, b) , Abi :: ScalarPair ( a_abi, b_abi) ) => {
246250 // Bools in union fields needs to be truncated.
247251 * a = bx. to_immediate_scalar ( * a, a_abi) ;
248252 * b = bx. to_immediate_scalar ( * b, b_abi) ;
249253 // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
250- * a = bx. bitcast ( * a, bx. cx ( ) . scalar_pair_element_backend_type ( field, 0 , true ) ) ;
251- * b = bx. bitcast ( * b, bx. cx ( ) . scalar_pair_element_backend_type ( field, 1 , true ) ) ;
254+ let a_ty = bx. cx ( ) . scalar_pair_element_backend_type ( field, 0 , true ) ;
255+ let b_ty = bx. cx ( ) . scalar_pair_element_backend_type ( field, 1 , true ) ;
256+ if bx. type_kind ( a_ty) == TypeKind :: Pointer {
257+ * a = bx. pointercast ( * a, a_ty) ;
258+ }
259+ if bx. type_kind ( b_ty) == TypeKind :: Pointer {
260+ * b = bx. pointercast ( * b, b_ty) ;
261+ }
252262 }
253263 ( OperandValue :: Pair ( ..) , _) => bug ! ( ) ,
254264 ( OperandValue :: Ref ( ..) , _) => bug ! ( ) ,
0 commit comments