diff options
| author | Tyler Mandry <tmandry@gmail.com> | 2019-04-18 14:39:03 -0700 |
|---|---|---|
| committer | Tyler Mandry <tmandry@gmail.com> | 2019-04-25 10:28:09 -0700 |
| commit | b8f6de4aca47ddd1daa5217813848155a2a825fa (patch) | |
| tree | 9c7ea87c73cf976fcca8be1b17f2971859ef2cb0 /src/librustc_codegen_ssa | |
| parent | f772c39bf9fb3af982bb9a4728d4fdc7308a8bbd (diff) | |
| download | rust-b8f6de4aca47ddd1daa5217813848155a2a825fa.tar.gz rust-b8f6de4aca47ddd1daa5217813848155a2a825fa.zip | |
Generalize discriminant info calls for generators and ADTs
Diffstat (limited to 'src/librustc_codegen_ssa')
| -rw-r--r-- | src/librustc_codegen_ssa/mir/place.rs | 16 | ||||
| -rw-r--r-- | src/librustc_codegen_ssa/mir/rvalue.rs | 11 |
2 files changed, 9 insertions, 18 deletions
diff --git a/src/librustc_codegen_ssa/mir/place.rs b/src/librustc_codegen_ssa/mir/place.rs index 2875468127e..670b6c47269 100644 --- a/src/librustc_codegen_ssa/mir/place.rs +++ b/src/librustc_codegen_ssa/mir/place.rs @@ -218,9 +218,8 @@ impl<'a, 'tcx: 'a, V: CodegenObject> PlaceRef<'tcx, V> { } let (discr_scalar, discr_kind, discr_index) = match self.layout.variants { layout::Variants::Single { index } => { - let discr_val = self.layout.ty.ty_adt_def().map_or( - index.as_u32() as u128, - |def| def.discriminant_for_variant(bx.cx().tcx(), index).val); + let discr_val = self.layout.ty.discriminant_for_variant(bx.cx().tcx(), index) + .map_or(index.as_u32() as u128, |discr| discr.val); return bx.cx().const_uint_big(cast_to, discr_val); } layout::Variants::Multiple { ref discr, ref discr_kind, discr_index, .. } => { @@ -296,15 +295,8 @@ impl<'a, 'tcx: 'a, V: CodegenObject> PlaceRef<'tcx, V> { .. } => { let ptr = self.project_field(bx, discr_index); - let to = match self.layout.ty.sty { - ty::TyKind::Adt(adt_def, _) => adt_def - .discriminant_for_variant(bx.tcx(), variant_index) - .val, - // Generators don't support explicit discriminant values, so - // they are the same as the variant index. - ty::TyKind::Generator(..) => variant_index.as_u32() as u128, - _ => bug!(), - }; + let to = + self.layout.ty.discriminant_for_variant(bx.tcx(), variant_index).unwrap().val; bx.store( bx.cx().const_uint_big(bx.cx().backend_type(ptr.layout), to), ptr.llval, diff --git a/src/librustc_codegen_ssa/mir/rvalue.rs b/src/librustc_codegen_ssa/mir/rvalue.rs index 35e9d918aa6..8573021bef3 100644 --- a/src/librustc_codegen_ssa/mir/rvalue.rs +++ b/src/librustc_codegen_ssa/mir/rvalue.rs @@ -271,13 +271,12 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let ll_t_in = bx.cx().immediate_backend_type(operand.layout); match operand.layout.variants { layout::Variants::Single { index } => { - if let Some(def) = operand.layout.ty.ty_adt_def() { - let discr_val = def - .discriminant_for_variant(bx.cx().tcx(), index) - .val; - let discr = bx.cx().const_uint_big(ll_t_out, discr_val); + if let Some(discr) = + operand.layout.ty.discriminant_for_variant(bx.tcx(), index) + { + let discr_val = bx.cx().const_uint_big(ll_t_out, discr.val); return (bx, OperandRef { - val: OperandValue::Immediate(discr), + val: OperandValue::Immediate(discr_val), layout: cast, }); } |
