Skip to content

Commit edcb7ab

Browse files
committed
also test projecting to some sized fields at non-zero offset in structs with an extern type tail
1 parent a47416b commit edcb7ab

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

‎tests/ui/consts/const-eval/issue-91827-extern-types-field-offset.rs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ struct Newtype(Opaque);
1313

1414
structS{
1515
i:i32,
16-
a:Opaque,
16+
j:i32,
17+
a:Newtype,
1718
}
1819

1920
constNEWTYPE:() = unsafe{
@@ -28,6 +29,10 @@ const OFFSET: () = unsafe {
2829
let buf = [0i32;4];
2930
let x:&S = &*(&buf as*const_as*constS);
3031

32+
// Accessing sized fields is perfectly fine, even at non-zero offsets.
33+
let field = &x.i;
34+
let field = &x.j;
35+
3136
// This needs to compute the field offset, but we don't know the type's alignment, so this
3237
// fails.
3338
let field = &x.a;

‎tests/ui/consts/const-eval/issue-91827-extern-types-field-offset.stderr‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0080]: evaluation of constant value failed
2-
--> $DIR/issue-91827-extern-types-field-offset.rs:33:17
2+
--> $DIR/issue-91827-extern-types-field-offset.rs:38:17
33
|
44
LL | let field = &x.a;
55
| ^^^^ `extern type` does not have a known offset

‎tests/ui/extern/extern-types-field-offset.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,22 @@ struct Newtype(Opaque);
1212

1313
structS{
1414
i:i32,
15-
a:Opaque,
15+
j:i32,
16+
a:Newtype,
1617
}
1718

1819
fnmain(){
20+
let buf = [0i32;4];
21+
22+
let x:&Newtype = unsafe{&*(&buf as*const_as*constNewtype)};
1923
// Projecting to the newtype works, because it is always at offset 0.
20-
let x:&Newtype = unsafe{&*(1usizeas*constNewtype)};
2124
let field = &x.0;
2225

26+
let x:&S = unsafe{&*(&buf as*const_as*constS)};
27+
// Accessing sized fields is perfectly fine, even at non-zero offsets.
28+
let field = &x.i;
29+
let field = &x.j;
2330
// This needs to compute the field offset, but we don't know the type's alignment,
2431
// so this panics.
25-
let x:&S = unsafe{&*(1usizeas*constS)};
2632
let field = &x.a;
2733
}

0 commit comments

Comments
 (0)