From 7a8f3afaa5de33324d0171d55d065bdfc050297f Mon Sep 17 00:00:00 2001 From: Rudraksh Joshi Date: Tue, 14 Apr 2026 15:40:12 +0530 Subject: [PATCH 1/2] handle unsized by-ref values --- src/value_and_place.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/value_and_place.rs b/src/value_and_place.rs index 5b76a4cb97..f1a3e25829 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -204,7 +204,14 @@ impl<'tcx> CValue<'tcx> { let (field_ptr, field_layout) = codegen_field(fx, ptr, None, layout, field); CValue::by_ref(field_ptr, field_layout) } - CValueInner::ByRef(_, Some(_)) => todo!(), + CValueInner::ByRef(ptr, Some(extra)) => { + let (field_ptr, field_layout) = codegen_field(fx, ptr, Some(extra), layout, field); + if fx.tcx.type_has_metadata(field_layout.ty, ty::TypingEnv::fully_monomorphized()) { + CValue::by_ref_unsized(field_ptr, extra, field_layout) + } else { + CValue::by_ref(field_ptr, field_layout) + } + } } } @@ -655,7 +662,26 @@ impl<'tcx> CPlace<'tcx> { flags, ); } - CValueInner::ByRef(_, Some(_)) => todo!(), + CValueInner::ByRef(from_ptr, Some(_extra)) => { + // Unsized values shouldn't normally be written into sized places. However, + // if this happens, we can still copy the sized prefix using the destination layout's fixed size. + let from_addr = from_ptr.get_addr(fx); + let to_addr = to_ptr.get_addr(fx); + let src_layout = from.1; + let size = dst_layout.size.bytes(); + let src_align = src_layout.align.bytes().try_into().unwrap_or(128); + let dst_align = dst_layout.align.bytes().try_into().unwrap_or(128); + fx.bcx.emit_small_memory_copy( + fx.target_config, + to_addr, + from_addr, + size, + dst_align, + src_align, + true, + flags, + ); + } } } } From 2237da26521fe1fec63c373b729ac41c69b1d02b Mon Sep 17 00:00:00 2001 From: Rudraksh Joshi Date: Tue, 14 Apr 2026 16:04:20 +0530 Subject: [PATCH 2/2] fail loudly on unsized by-ref invariants --- src/value_and_place.rs | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/src/value_and_place.rs b/src/value_and_place.rs index f1a3e25829..e6d723a954 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -204,13 +204,8 @@ impl<'tcx> CValue<'tcx> { let (field_ptr, field_layout) = codegen_field(fx, ptr, None, layout, field); CValue::by_ref(field_ptr, field_layout) } - CValueInner::ByRef(ptr, Some(extra)) => { - let (field_ptr, field_layout) = codegen_field(fx, ptr, Some(extra), layout, field); - if fx.tcx.type_has_metadata(field_layout.ty, ty::TypingEnv::fully_monomorphized()) { - CValue::by_ref_unsized(field_ptr, extra, field_layout) - } else { - CValue::by_ref(field_ptr, field_layout) - } + CValueInner::ByRef(_, Some(_)) => { + bug!("value_field for unsized by-ref value not supported") } } } @@ -662,24 +657,11 @@ impl<'tcx> CPlace<'tcx> { flags, ); } - CValueInner::ByRef(from_ptr, Some(_extra)) => { - // Unsized values shouldn't normally be written into sized places. However, - // if this happens, we can still copy the sized prefix using the destination layout's fixed size. - let from_addr = from_ptr.get_addr(fx); - let to_addr = to_ptr.get_addr(fx); - let src_layout = from.1; - let size = dst_layout.size.bytes(); - let src_align = src_layout.align.bytes().try_into().unwrap_or(128); - let dst_align = dst_layout.align.bytes().try_into().unwrap_or(128); - fx.bcx.emit_small_memory_copy( - fx.target_config, - to_addr, - from_addr, - size, - dst_align, - src_align, - true, - flags, + CValueInner::ByRef(_from_ptr, Some(_extra)) => { + bug!( + "write_cvalue for unsized by-ref value not allowed: dst={:?} src={:?}", + dst_layout.ty, + from.layout().ty ); } }