From ab57af4e6ac5d307db006a1b1cbd4ab60577eeb2 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sat, 6 Oct 2018 11:21:18 +0200 Subject: [PATCH] Fix projection of sized field in unsized type --- example/example.rs | 10 ++++++++++ src/common.rs | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/example/example.rs b/example/example.rs index 9e247964f32..eebc8c126e9 100644 --- a/example/example.rs +++ b/example/example.rs @@ -196,3 +196,13 @@ fn str_wrapper_get(w: &StrWrapper) -> &str { fn i16_as_i8(a: i16) -> i8 { a as i8 } + +struct Unsized(u8, str); + +fn get_sized_field_ref_from_unsized_type(u: &Unsized) -> &u8 { + &u.0 +} + +fn get_unsized_field_ref_from_unsized_type(u: &Unsized) -> &str { + &u.1 +} diff --git a/src/common.rs b/src/common.rs index b11ab0445d3..fb030470936 100644 --- a/src/common.rs +++ b/src/common.rs @@ -460,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) } } -- 2.44.0