The code incorrectly assumes that a type parameter which is not known to meet Sized will not meet Sized. So this code fails:
use std::mem::transmute;
fn foo<T, Sized? U>(x: &[T]) -> &U {
unsafe { transmute(x) }
}
fn main() {
let x = [1, 2, 3];
foo::<int, int>(&x);
}
I'm overhauling how we handle Sized and will fix this to be more conservative, I guess.
However, I think that long term this approach of baking in weird rules around the transmute intrinsic is not good. It might be better (and perhaps just as easy or easier?) to have transmute reference a "magic" trait SameSize. This would allow generic code to expose and "bubble up" the transmutable requirement to its parents. It would also be useful for some of the in-place vec methods.
The code incorrectly assumes that a type parameter which is not known to meet
Sizedwill not meetSized. So this code fails:I'm overhauling how we handle
Sizedand will fix this to be more conservative, I guess.However, I think that long term this approach of baking in weird rules around the
transmuteintrinsic is not good. It might be better (and perhaps just as easy or easier?) to have transmute reference a "magic" traitSameSize. This would allow generic code to expose and "bubble up" the transmutable requirement to its parents. It would also be useful for some of the in-place vec methods.