also test projecting to some sized fields at non-zero offset in structs with an extern type tail
This commit is contained in:
parent
a47416beb5
commit
edcb7aba6b
@ -13,7 +13,8 @@
|
||||
|
||||
struct S {
|
||||
i: i32,
|
||||
a: Opaque,
|
||||
j: i32,
|
||||
a: Newtype,
|
||||
}
|
||||
|
||||
const NEWTYPE: () = unsafe {
|
||||
@ -28,6 +29,10 @@ struct S {
|
||||
let buf = [0i32; 4];
|
||||
let x: &S = &*(&buf as *const _ as *const S);
|
||||
|
||||
// Accessing sized fields is perfectly fine, even at non-zero offsets.
|
||||
let field = &x.i;
|
||||
let field = &x.j;
|
||||
|
||||
// This needs to compute the field offset, but we don't know the type's alignment, so this
|
||||
// fails.
|
||||
let field = &x.a;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/issue-91827-extern-types-field-offset.rs:33:17
|
||||
--> $DIR/issue-91827-extern-types-field-offset.rs:38:17
|
||||
|
|
||||
LL | let field = &x.a;
|
||||
| ^^^^ `extern type` does not have a known offset
|
||||
|
12
tests/ui/extern/extern-types-field-offset.rs
vendored
12
tests/ui/extern/extern-types-field-offset.rs
vendored
@ -12,16 +12,22 @@
|
||||
|
||||
struct S {
|
||||
i: i32,
|
||||
a: Opaque,
|
||||
j: i32,
|
||||
a: Newtype,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let buf = [0i32; 4];
|
||||
|
||||
let x: &Newtype = unsafe { &*(&buf as *const _ as *const Newtype) };
|
||||
// Projecting to the newtype works, because it is always at offset 0.
|
||||
let x: &Newtype = unsafe { &*(1usize as *const Newtype) };
|
||||
let field = &x.0;
|
||||
|
||||
let x: &S = unsafe { &*(&buf as *const _ as *const S) };
|
||||
// Accessing sized fields is perfectly fine, even at non-zero offsets.
|
||||
let field = &x.i;
|
||||
let field = &x.j;
|
||||
// This needs to compute the field offset, but we don't know the type's alignment,
|
||||
// so this panics.
|
||||
let x: &S = unsafe { &*(1usize as *const S) };
|
||||
let field = &x.a;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user