_ => unreachable!("cast adt {} -> {}", from_ty, to_ty),
}
- // FIXME avoid forcing to stack
- let place =
- CPlace::for_addr(operand.force_stack(fx), operand.layout());
- let discr = crate::discriminant::codegen_get_discriminant(fx, place, fx.layout_of(to_ty));
+ let discr = crate::discriminant::codegen_get_discriminant(fx, operand, fx.layout_of(to_ty));
lval.write_cvalue(fx, discr);
} else {
let to_clif_ty = fx.clif_type(to_ty).unwrap();
}
Rvalue::Discriminant(place) => {
let place = trans_place(fx, place);
- let discr = crate::discriminant::codegen_get_discriminant(fx, place, dest_layout);
+ let value = place.to_cvalue(fx);
+ let discr = crate::discriminant::codegen_get_discriminant(fx, value, dest_layout);
lval.write_cvalue(fx, discr);
}
Rvalue::Repeat(operand, times) => {
pub fn codegen_get_discriminant<'tcx>(
fx: &mut FunctionCx<'_, 'tcx, impl Backend>,
- place: CPlace<'tcx>,
+ value: CValue<'tcx>,
dest_layout: TyLayout<'tcx>,
) -> CValue<'tcx> {
- let layout = place.layout();
+ let layout = value.layout();
if layout.abi == layout::Abi::Uninhabited {
return trap_unreachable_ret_value(fx, dest_layout, "[panic] Tried to get discriminant for uninhabited type.");
}
};
- let discr = place.place_field(fx, mir::Field::new(discr_index)).to_cvalue(fx);
+ let discr = value.value_field(fx, mir::Field::new(discr_index));
let discr_ty = discr.layout().ty;
let lldiscr = discr.load_scalar(fx);
match discr_kind {
fx.bcx.call_memmove(fx.module.target_config(), dst, src, byte_amount);
}
};
- discriminant_value, (c val) {
- let pointee_layout = fx.layout_of(val.layout().ty.builtin_deref(true).unwrap().ty);
- let place = CPlace::for_addr(val.load_scalar(fx), pointee_layout);
- let discr = crate::discriminant::codegen_get_discriminant(fx, place, ret.layout());
+ discriminant_value, (c ptr) {
+ let pointee_layout = fx.layout_of(ptr.layout().ty.builtin_deref(true).unwrap().ty);
+ let val = CValue::by_ref(ptr.load_scalar(fx), pointee_layout);
+ let discr = crate::discriminant::codegen_get_discriminant(fx, val, ret.layout());
ret.write_cvalue(fx, discr);
};
size_of, <T> () {