| struct Foo { | |
| inner: u32, | |
| } | |
| struct Bar { | |
| inner: u32, | |
| } | |
| #[derive(Clone, Copy)] | |
| struct Baz { | |
| inner: u32, | |
| } | |
| impl From<Baz> for Bar { | |
| fn from(other: Baz) -> Self { | |
| Self { | |
| inner: other.inner, | |
| } | |
| } | |
| } | |
| impl From<Baz> for Foo { | |
| fn from(other: Baz) -> Self { | |
| Self { | |
| inner: other.inner, | |
| } | |
| } | |
| } | |
| fn main() { | |
| let x: Baz = Baz { inner: 42 }; | |
| // DOESN'T Compile: Multiple options! | |
| let y = x.into(); //~ ERROR E0283 | |
| let y_1: Foo = x.into(); | |
| let y_2: Bar = x.into(); | |
| let z_1 = Foo::from(y_1); | |
| let z_2 = Bar::from(y_2); | |
| // No type annotations needed, the compiler KNOWS the type must be `Foo`! | |
| let m = magic_foo(x); | |
| } | |
| fn magic_foo(arg: Baz) -> Foo { | |
| arg.into() | |
| } | |
| struct Value; | |
| impl PartialEq<Value> for u32 { | |
| fn eq(&self, _: &Value) -> bool { | |
| false | |
| } | |
| } | |
| impl PartialEq<u32> for Value { | |
| fn eq(&self, _: &u32) -> bool { | |
| false | |
| } | |
| } | |
| // https://github.com/rust-lang/rust/issues/156004 | |
| fn partial_eq_with_infer_cast_on_rhs() { | |
| let n: u32 = 17; | |
| let _ = n == 42usize as _; //~ ERROR E0283 | |
| } | |
| fn partial_eq_with_infer_cast_on_lhs() { | |
| let n: u32 = 17; | |
| let _ = 42usize as _ == n; //~ ERROR E0283 | |
| } | |
| fn unrelated_infer_cast_in_lhs() { | |
| let n: u32 = 17; | |
| let _ = ( | |
| { | |
| let _ = 42usize as _; //~ ERROR E0282 | |
| Default::default() | |
| } | |
| ) == n; | |
| } | |
| struct AddRhs; | |
| impl std::ops::Add<AddRhs> for u32 { | |
| type Output = (); | |
| fn add(self, _: AddRhs) {} | |
| } | |
| impl std::ops::Add<AddRhs> for i32 { | |
| type Output = (); | |
| fn add(self, _: AddRhs) {} | |
| } | |
| fn add_with_infer_cast_on_lhs() { | |
| let _: () = 42usize as _ + AddRhs; //~ ERROR E0283 | |
| } |