mirror of https://github.com/rust-lang/rust.git
39 lines
874 B
Rust
39 lines
874 B
Rust
//@ revisions: legacy v0
|
|
//@[v0] compile-flags: -C symbol-mangling-version=v0
|
|
//@[legacy] compile-flags: -C symbol-mangling-version=legacy -Zunstable-options
|
|
//@ build-pass
|
|
|
|
pub struct Vec2;
|
|
|
|
pub trait Point {
|
|
type S;
|
|
}
|
|
impl Point for Vec2 {
|
|
type S = f32;
|
|
}
|
|
|
|
pub trait Point2: Point<S = Self::S2> {
|
|
type S2;
|
|
}
|
|
impl Point2 for Vec2 {
|
|
type S2 = Self::S;
|
|
}
|
|
|
|
trait MyFrom<T> {
|
|
fn my_from();
|
|
}
|
|
impl<P: Point2> MyFrom<P::S> for P {
|
|
fn my_from() {
|
|
// This is just a really dumb way to force the legacy symbol mangling to
|
|
// mangle the closure's parent impl def path *with* args. Otherwise,
|
|
// legacy symbol mangling will strip the args from the instance, meaning
|
|
// that we don't trigger the bug.
|
|
let c = || {};
|
|
let x = Box::new(c) as Box<dyn Fn()>;
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
<Vec2 as MyFrom<_>>::my_from();
|
|
}
|