mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
Fix data layout of reference to nested unsized structs
This commit is contained in:
parent
f53f9230f0
commit
302bb3c871
3 changed files with 53 additions and 1 deletions
|
@ -2490,6 +2490,37 @@ fn type_error() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unsized_field() {
|
||||||
|
check_number(
|
||||||
|
r#"
|
||||||
|
//- minicore: coerce_unsized, index, slice, transmute
|
||||||
|
use core::mem::transmute;
|
||||||
|
|
||||||
|
struct Slice([u8]);
|
||||||
|
struct Slice2(Slice);
|
||||||
|
|
||||||
|
impl Slice2 {
|
||||||
|
fn as_inner(&self) -> &Slice {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_bytes(&self) -> &[u8] {
|
||||||
|
&self.as_inner().0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const GOAL: u8 = unsafe {
|
||||||
|
let x: &[u8] = &[1, 2, 3];
|
||||||
|
let x: &Slice2 = transmute(x);
|
||||||
|
let x = x.as_bytes();
|
||||||
|
x[0] + x[1] + x[2]
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
6,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn unsized_local() {
|
fn unsized_local() {
|
||||||
check_fail(
|
check_fail(
|
||||||
|
|
|
@ -315,7 +315,10 @@ fn struct_tail_erasing_lifetimes(db: &dyn HirDatabase, pointee: Ty) -> Ty {
|
||||||
let data = db.struct_data(*i);
|
let data = db.struct_data(*i);
|
||||||
let mut it = data.variant_data.fields().iter().rev();
|
let mut it = data.variant_data.fields().iter().rev();
|
||||||
match it.next() {
|
match it.next() {
|
||||||
Some((f, _)) => field_ty(db, (*i).into(), f, subst),
|
Some((f, _)) => {
|
||||||
|
let last_field_ty = field_ty(db, (*i).into(), f, subst);
|
||||||
|
struct_tail_erasing_lifetimes(db, last_field_ty)
|
||||||
|
}
|
||||||
None => pointee,
|
None => pointee,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,6 +343,24 @@ fn return_position_impl_trait() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unsized_ref() {
|
||||||
|
size_and_align! {
|
||||||
|
struct S1([u8]);
|
||||||
|
struct S2(S1);
|
||||||
|
struct S3(i32, str);
|
||||||
|
struct S4(u64, S3);
|
||||||
|
#[allow(dead_code)]
|
||||||
|
struct S5 {
|
||||||
|
field1: u8,
|
||||||
|
field2: i16,
|
||||||
|
field_last: S4,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Goal(&'static S1, &'static S2, &'static S3, &'static S4, &'static S5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn enums() {
|
fn enums() {
|
||||||
size_and_align! {
|
size_and_align! {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue