2022-06-04 13:33:56 -05:00
|
|
|
//@ check-pass
|
|
|
|
|
|
|
|
#![feature(coerce_unsized)]
|
|
|
|
|
|
|
|
// Ensure that unsizing structs that contain ZSTs at non-zero offsets don't ICE
|
|
|
|
|
|
|
|
use std::ops::CoerceUnsized;
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct BoxWithZstTail<T: ?Sized>(Box<T>, ());
|
|
|
|
|
|
|
|
impl<S: ?Sized, T: ?Sized> CoerceUnsized<BoxWithZstTail<T>> for BoxWithZstTail<S> where
|
|
|
|
Box<S>: CoerceUnsized<Box<T>>
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn noop_dyn_upcast_with_zst_tail(
|
2022-06-06 10:19:33 -05:00
|
|
|
b: BoxWithZstTail<dyn ToString + Send>,
|
|
|
|
) -> BoxWithZstTail<dyn ToString> {
|
2022-06-04 13:33:56 -05:00
|
|
|
b
|
|
|
|
}
|
|
|
|
|
2022-06-06 10:19:33 -05:00
|
|
|
fn main() {
|
|
|
|
let original = "foo";
|
|
|
|
let boxed = BoxWithZstTail(Box::new(original) as Box<dyn ToString + Send>, ());
|
|
|
|
let noop_upcasted = noop_dyn_upcast_with_zst_tail(boxed);
|
|
|
|
assert_eq!(original, noop_upcasted.0.to_string());
|
|
|
|
}
|