I was playing around with defining higher ranked types using trait objects and tried the following pattern.
trait A<T>: B<T = T> {}
trait B {
type T;
}
To my surprise trait objects of the form dyn for<'a> A<&'a T> were allowed. After some experimentation I found that this leads to UB in safe rust.
trait A<T>: B<T = T> {}
trait B {
type T;
}
struct Erase<T: ?Sized + B>(T::T);
fn main() {
let x = {
let x = String::from("hello");
Erase::<dyn for<'a> A<&'a _>>(x.as_str())
};
dbg!(x.0);
}
[src/main.rs:16:5] x.0 = "\0\0\0\0\0"
playground
This is likely related to 25860 somehow, but I haven't seen this flavor before.
Meta
This effects all versions from latest nightly to 1.33.0 (on 1.32.0 it causes a ICE, and before it wasn't allowed).
I was playing around with defining higher ranked types using trait objects and tried the following pattern.
To my surprise trait objects of the form
dyn for<'a> A<&'a T>were allowed. After some experimentation I found that this leads to UB in safe rust.playground
This is likely related to 25860 somehow, but I haven't seen this flavor before.
Meta
This effects all versions from latest nightly to 1.33.0 (on 1.32.0 it causes a ICE, and before it wasn't allowed).