summaryrefslogtreecommitdiffstats
path: root/src/test/ui/let-else/let-else-deref-coercion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/let-else/let-else-deref-coercion.rs')
-rw-r--r--src/test/ui/let-else/let-else-deref-coercion.rs75
1 files changed, 0 insertions, 75 deletions
diff --git a/src/test/ui/let-else/let-else-deref-coercion.rs b/src/test/ui/let-else/let-else-deref-coercion.rs
deleted file mode 100644
index 052a5a8c7..000000000
--- a/src/test/ui/let-else/let-else-deref-coercion.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-// Taken from https://github.com/rust-lang/rust/blob/6cc0a764e082d9c0abcf37a768d5889247ba13e2/compiler/rustc_typeck/src/check/_match.rs#L445-L462
-//
-// We attempt to `let Bar::Present(_) = foo else { ... }` where foo is meant to Deref/DerefMut to
-// Bar. This fails, you must add a type annotation like `let _: &mut Bar = _ else { ... }`
-
-
-use std::ops::{Deref, DerefMut};
-
-struct Foo(Bar);
-
-enum Bar {
- Present(u32),
- Absent,
-}
-impl Deref for Foo {
- type Target = Bar;
- fn deref(&self) -> &Bar {
- &self.0
- }
-}
-impl DerefMut for Foo {
- fn deref_mut(&mut self) -> &mut Bar {
- &mut self.0
- }
-}
-impl Bar {
- fn bar(&self) -> Option<u32> {
- let Bar::Present(z): &Bar = self else {
- return None;
- };
- return Some(*z);
- }
-}
-impl Foo {
- // Try without the type annotation
- fn set_bar_unannotated(&mut self, value: u32) {
- let Bar::Present(z) = self else { //~ ERROR mismatched types
- return;
- };
- *z = value;
- }
-}
-
-fn main() {
- let mut foo = Foo(Bar::Present(1));
- foo.set_bar_unannotated(54);
- assert_eq!(foo.bar(), Some(54));
- irrefutable::inner();
-}
-
-// The original, to show it fails for irrefutable let decls
-mod irrefutable {
- use std::ops::{Deref, DerefMut};
- struct Foo(Bar);
- struct Bar(u32);
- impl Deref for Foo {
- type Target = Bar;
- fn deref(&self) -> &Bar {
- &self.0
- }
- }
- impl DerefMut for Foo {
- fn deref_mut(&mut self) -> &mut Bar {
- &mut self.0
- }
- }
- fn foo(x: &mut Foo) {
- let Bar(z) = x; //~ ERROR mismatched types
- *z = 54;
- assert_eq!((x.0).0, 54);
- }
- pub fn inner() {
- foo(&mut Foo(Bar(1)));
- }
-}