blob: d96ee635317a756a2c475dd07e3a66087492625f [file]
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
}