about summary refs log tree commit diff
path: root/tests/ui/inference/multiple-impl-apply.rs
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2023-08-14 11:56:23 +0000
committerEsteban Küber <esteban@kuber.com.ar>2023-10-04 02:04:13 +0000
commit2817ece19c67a182c0b0aae402c0e57c8ed22dab (patch)
tree24b913b9bd9c8b6cc33d14e31d3608953846340a /tests/ui/inference/multiple-impl-apply.rs
parent79f38b79147a5fb3c52d1fd1afc571226a77419c (diff)
downloadrust-2817ece19c67a182c0b0aae402c0e57c8ed22dab.tar.gz
rust-2817ece19c67a182c0b0aae402c0e57c8ed22dab.zip
Show more information when multiple `impl` apply
Diffstat (limited to 'tests/ui/inference/multiple-impl-apply.rs')
-rw-r--r--tests/ui/inference/multiple-impl-apply.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/ui/inference/multiple-impl-apply.rs b/tests/ui/inference/multiple-impl-apply.rs
new file mode 100644
index 00000000000..e6a6b928e56
--- /dev/null
+++ b/tests/ui/inference/multiple-impl-apply.rs
@@ -0,0 +1,50 @@
+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 E0282
+    //~| 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()
+}