]> git.lizzy.rs Git - rust.git/blobdiff - src/common.rs
Fix projection of sized field in unsized type
[rust.git] / src / common.rs
index 51706c888e4dedf48ddee5357035dc3962e4dd32..fb030470936a4786bd18970dd72ae176c042bd83 100644 (file)
@@ -116,10 +116,11 @@ pub fn force_stack<'a>(self, fx: &mut FunctionCx<'a, 'tcx, impl Backend>) -> Val
                     size: layout.size.bytes() as u32,
                     offset: None,
                 });
-                fx.bcx.ins().stack_store(value, stack_slot, 0);
-                fx.bcx
+                let addr = fx.bcx
                     .ins()
-                    .stack_addr(fx.module.pointer_type(), stack_slot, 0)
+                    .stack_addr(fx.module.pointer_type(), stack_slot, 0);
+                fx.bcx.ins().store(MemFlags::new(), value, addr, 0);
+                addr
             }
             CValue::ByValPair(value, extra, layout) => {
                 let stack_slot = fx.bcx.create_stack_slot(StackSlotData {
@@ -459,6 +460,12 @@ pub fn place_field(
             }
             CPlace::Addr(base, extra, layout) => {
                 let (field_ptr, field_layout) = codegen_field(fx, base, layout, field);
+                let extra = if field_layout.is_unsized() {
+                    assert!(extra.is_some());
+                    extra
+                } else {
+                    None
+                };
                 CPlace::Addr(field_ptr, extra, field_layout)
             }
         }
@@ -584,6 +591,8 @@ pub fn cton_intcast<'a, 'tcx: 'a>(
 
 pub struct FunctionCx<'a, 'tcx: 'a, B: Backend + 'a> {
     pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
+    // FIXME get isa from Module
+    pub isa: &'a isa::TargetIsa,
     pub module: &'a mut Module<B>,
     pub instance: Instance<'tcx>,
     pub mir: &'tcx Mir<'tcx>,