Skip to content

Commit bab8113

Browse files
committed
Fix discriminant_value intrinsic
Fixes rust-lang#349
1 parent ccf07ad commit bab8113

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

example/std_example.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,12 @@ fn main() {
1515

1616
static ONCE: std::sync::Once = std::sync::ONCE_INIT;
1717
ONCE.call_once(|| {});
18+
19+
LoopState::Continue(()) == LoopState::Break(());
20+
}
21+
22+
#[derive(PartialEq)]
23+
enum LoopState {
24+
Continue(()),
25+
Break(())
1826
}

src/base.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ fn trans_stmt<'a, 'tcx: 'a>(
570570
lval.write_cvalue(fx, CValue::ByVal(res, dest_layout));
571571
}
572572
(ty::Adt(adt_def, _substs), ty::Uint(_)) | (ty::Adt(adt_def, _substs), ty::Int(_)) if adt_def.is_enum() => {
573-
let discr = trans_get_discriminant(fx, operand, fx.layout_of(to_ty));
573+
// FIXME avoid forcing to stack
574+
let place = CPlace::Addr(operand.force_stack(fx), None, operand.layout());
575+
let discr = trans_get_discriminant(fx, place, fx.layout_of(to_ty));
574576
lval.write_cvalue(fx, discr);
575577
}
576578
_ => unimpl!("rval misc {:?} {:?}", from_ty, to_ty),
@@ -584,7 +586,7 @@ fn trans_stmt<'a, 'tcx: 'a>(
584586
operand.unsize_value(fx, lval);
585587
}
586588
Rvalue::Discriminant(place) => {
587-
let place = trans_place(fx, place).to_cvalue(fx);
589+
let place = trans_place(fx, place);
588590
let discr = trans_get_discriminant(fx, place, dest_layout);
589591
lval.write_cvalue(fx, discr);
590592
}
@@ -680,10 +682,10 @@ fn codegen_array_len<'a, 'tcx: 'a>(
680682

681683
pub fn trans_get_discriminant<'a, 'tcx: 'a>(
682684
fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
683-
value: CValue<'tcx>,
685+
place: CPlace<'tcx>,
684686
dest_layout: TyLayout<'tcx>,
685687
) -> CValue<'tcx> {
686-
let layout = value.layout();
688+
let layout = place.layout();
687689

688690
if layout.abi == layout::Abi::Uninhabited {
689691
trap_unreachable(&mut fx.bcx);
@@ -701,7 +703,7 @@ pub fn trans_get_discriminant<'a, 'tcx: 'a>(
701703
layout::Variants::Tagged { .. } | layout::Variants::NicheFilling { .. } => {}
702704
}
703705

704-
let discr = value.value_field(fx, mir::Field::new(0));
706+
let discr = place.place_field(fx, mir::Field::new(0)).to_cvalue(fx);
705707
let discr_ty = discr.layout().ty;
706708
let lldiscr = discr.load_scalar(fx);
707709
match layout.variants {

src/intrinsics.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
141141
}
142142
};
143143
discriminant_value, (c val) {
144-
let discr = crate::base::trans_get_discriminant(fx, val, ret.layout());
144+
let pointee_layout = fx.layout_of(val.layout().ty.builtin_deref(true).unwrap().ty);
145+
let place = CPlace::Addr(val.load_scalar(fx), None, pointee_layout);
146+
let discr = crate::base::trans_get_discriminant(fx, place, ret.layout());
145147
ret.write_cvalue(fx, discr);
146148
};
147149
size_of, <T> () {

0 commit comments

Comments
 (0)