diff --git a/tests/ui/pattern/suggest-dereferencing-through-Deref.fixed b/tests/ui/pattern/suggest-dereferencing-through-Deref.fixed
new file mode 100644
index 0000000000000..a538929609d82
--- /dev/null
+++ b/tests/ui/pattern/suggest-dereferencing-through-Deref.fixed
@@ -0,0 +1,29 @@
+//@ run-rustfix
+#![allow(dead_code)]
+
+enum A {
+ V1(u8),
+ V2(u32),
+}
+
+fn foo() {
+ let a = Some(Box::new(A::V1(1u8)));
+
+ if let Some(b) = a.as_ref() {
+ if let A::V1(v) = &**b { //~ ERROR mismatched types
+ println!("{:?}", v);
+ }
+ }
+}
+
+fn bar() {
+ let a = Some(Box::new(A::V1(1u8)));
+
+ if let Some(b) = a.as_ref() {
+ if let A::V1(v) = **b { //~ ERROR mismatched types
+ println!("{:?}", v);
+ }
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/pattern/suggest-dereferencing-through-Deref.rs b/tests/ui/pattern/suggest-dereferencing-through-Deref.rs
new file mode 100644
index 0000000000000..c87fcf89497e3
--- /dev/null
+++ b/tests/ui/pattern/suggest-dereferencing-through-Deref.rs
@@ -0,0 +1,29 @@
+//@ run-rustfix
+#![allow(dead_code)]
+
+enum A {
+ V1(u8),
+ V2(u32),
+}
+
+fn foo() {
+ let a = Some(Box::new(A::V1(1u8)));
+
+ if let Some(b) = a.as_ref() {
+ if let A::V1(v) = b { //~ ERROR mismatched types
+ println!("{:?}", v);
+ }
+ }
+}
+
+fn bar() {
+ let a = Some(Box::new(A::V1(1u8)));
+
+ if let Some(b) = a.as_ref() {
+ if let A::V1(v) = *b { //~ ERROR mismatched types
+ println!("{:?}", v);
+ }
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/pattern/suggest-dereferencing-through-Deref.stderr b/tests/ui/pattern/suggest-dereferencing-through-Deref.stderr
new file mode 100644
index 0000000000000..61f79f30137f2
--- /dev/null
+++ b/tests/ui/pattern/suggest-dereferencing-through-Deref.stderr
@@ -0,0 +1,33 @@
+error[E0308]: mismatched types
+ --> $DIR/suggest-dereferencing-through-Deref.rs:13:16
+ |
+LL | if let A::V1(v) = b {
+ | ^^^^^^^^ - this expression has type `&Box`
+ | |
+ | expected `Box`, found `A`
+ |
+ = note: expected struct `Box`
+ found enum `A`
+help: consider dereferencing to access the inner value using the Deref trait
+ |
+LL | if let A::V1(v) = &**b {
+ | ~~~~
+
+error[E0308]: mismatched types
+ --> $DIR/suggest-dereferencing-through-Deref.rs:23:16
+ |
+LL | if let A::V1(v) = *b {
+ | ^^^^^^^^ -- this expression has type `Box`
+ | |
+ | expected `Box`, found `A`
+ |
+ = note: expected struct `Box`
+ found enum `A`
+help: consider dereferencing the boxed value
+ |
+LL | if let A::V1(v) = **b {
+ | ~~~
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.