Unsize isn't implemented for unions

987a5b5
Opened by Steven Fackler at 2023-07-03 09:40:53

This came up in the fix for #48493. It seems like unions should have unsize impls for all of their fields?

#![feature(untagged_unions, unsize, coerce_unsized)]
use std::marker::Unsize;
use std::ops::CoerceUnsized;

union Data<T: ?Sized> {
    v: T,
    u: (),
}

struct Pointer<T: ?Sized>(Box<Data<T>>);

impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Pointer<U>> for Pointer<T> {}

fn main() {}
error[E0277]: the trait bound `Data<T>: std::marker::Unsize<Data<U>>` is not satisfied
  --> src/main.rs:12:1
   |
12 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Pointer<U>> for Pointer<T> {}
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Unsize<Data<U>>` is not implemented for `Data<T>`
   |
   = note: required because of the requirements on the impl of `std::ops::CoerceUnsized<std::boxed::Box<Data<U>>>` for `std::boxed::Box<Data<T>>`

error: aborting due to previous error

If you want more information on this error, try using "rustc --explain E0277"
error: Could not compile `playground`.

To learn more, run the command again with --verbose.
  1. Please check the discussion in #47650.

    kennytm at 2018-03-09 05:11:42

  2. Ah thanks!

    Steven Fackler at 2018-03-09 05:12:05