rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.6k stars 12.74k forks source link

Unsize isn't implemented for unions #48863

Open sfackler opened 6 years ago

sfackler commented 6 years ago

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.
kennytm commented 6 years ago

Please check the discussion in #47650.

sfackler commented 6 years ago

Ah thanks!