| //@ revisions: current next |
| //@ ignore-compare-mode-next-solver (explicit revisions) |
| //@[next] compile-flags: -Znext-solver |
| |
| // We previously wrongly instantiated binders during trait upcasting, |
| // allowing the super trait to be more generic than the sub trait. |
| // This was unsound. |
| #![feature(trait_upcasting)] |
| trait Supertrait<'a, 'b> { |
| fn cast(&self, x: &'a str) -> &'b str; |
| } |
| |
| trait Subtrait<'a, 'b>: Supertrait<'a, 'b> {} |
| |
| impl<'a> Supertrait<'a, 'a> for () { |
| fn cast(&self, x: &'a str) -> &'a str { |
| x |
| } |
| } |
| impl<'a> Subtrait<'a, 'a> for () {} |
| fn unsound(x: &dyn for<'a> Subtrait<'a, 'a>) -> &dyn for<'a, 'b> Supertrait<'a, 'b> { |
| x //~ ERROR mismatched types |
| //[current]~^ ERROR mismatched types |
| } |
| |
| fn transmute<'a, 'b>(x: &'a str) -> &'b str { |
| unsound(&()).cast(x) |
| } |
| |
| fn main() { |
| let x; |
| { |
| let mut temp = String::from("hello there"); |
| x = transmute(temp.as_str()); |
| } |
| println!("{x}"); |
| } |