Auto merge of #118534 - RalfJung:extern-type-size-of-val, r=WaffleLapkin
codegen: panic when trying to compute size/align of extern type The alignment is also computed when accessing a field of extern type at non-zero offset, so we also panic in that case. Previously `size_of_val` worked because the code path there assumed that "thin pointer" means "sized". But that's not true any more with extern types. The returned size and align are just blatantly wrong, so it seems better to panic than returning wrong results. We use a non-unwinding panic since code probably does not expect size_of_val to panic.
This commit is contained in:
commit
e3d2831ff4
@ -75,11 +75,6 @@ const fn jit_bin(config: &'static str, source: &'static str, args: &'static str)
|
|||||||
"example/arbitrary_self_types_pointers_and_wrappers.rs",
|
"example/arbitrary_self_types_pointers_and_wrappers.rs",
|
||||||
&[],
|
&[],
|
||||||
),
|
),
|
||||||
TestCase::build_bin_and_run(
|
|
||||||
"aot.issue_91827_extern_types",
|
|
||||||
"example/issue-91827-extern-types.rs",
|
|
||||||
&[],
|
|
||||||
),
|
|
||||||
TestCase::build_lib("build.alloc_system", "example/alloc_system.rs", "lib"),
|
TestCase::build_lib("build.alloc_system", "example/alloc_system.rs", "lib"),
|
||||||
TestCase::build_bin_and_run("aot.alloc_example", "example/alloc_example.rs", &[]),
|
TestCase::build_bin_and_run("aot.alloc_example", "example/alloc_example.rs", &[]),
|
||||||
TestCase::jit_bin("jit.std_example", "example/std_example.rs", ""),
|
TestCase::jit_bin("jit.std_example", "example/std_example.rs", ""),
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
// Copied from rustc ui test suite
|
|
||||||
|
|
||||||
// run-pass
|
|
||||||
//
|
|
||||||
// Test that we can handle unsized types with an extern type tail part.
|
|
||||||
// Regression test for issue #91827.
|
|
||||||
|
|
||||||
#![feature(extern_types)]
|
|
||||||
|
|
||||||
use std::ptr::addr_of;
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
type Opaque;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl Sync for Opaque {}
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct List<T> {
|
|
||||||
len: usize,
|
|
||||||
data: [T; 0],
|
|
||||||
tail: Opaque,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct ListImpl<T, const N: usize> {
|
|
||||||
len: usize,
|
|
||||||
data: [T; N],
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> List<T> {
|
|
||||||
const fn as_slice(&self) -> &[T] {
|
|
||||||
unsafe { std::slice::from_raw_parts(self.data.as_ptr(), self.len) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, const N: usize> ListImpl<T, N> {
|
|
||||||
const fn as_list(&self) -> &List<T> {
|
|
||||||
unsafe { std::mem::transmute(self) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub static A: ListImpl<u128, 3> = ListImpl { len: 3, data: [5, 6, 7] };
|
|
||||||
pub static A_REF: &'static List<u128> = A.as_list();
|
|
||||||
pub static A_TAIL_OFFSET: isize = tail_offset(A.as_list());
|
|
||||||
|
|
||||||
const fn tail_offset<T>(list: &List<T>) -> isize {
|
|
||||||
unsafe { (addr_of!(list.tail) as *const u8).offset_from(list as *const List<T> as *const u8) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
assert_eq!(A_REF.as_slice(), &[5, 6, 7]);
|
|
||||||
// Check that interpreter and code generation agree about the position of the tail field.
|
|
||||||
assert_eq!(A_TAIL_OFFSET, tail_offset(A_REF));
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user