about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNadrieril <nadrieril+git@gmail.com>2024-04-03 21:17:36 +0200
committerNadrieril <nadrieril+git@gmail.com>2024-04-03 23:16:27 +0200
commite2ebaa1a08aff195487cd7afacdaf7fb0ef62aa7 (patch)
tree47ca44b8ae1a2cc30c56e934e5cdc78ce38f4059
parent8021192d340730430810589b453f9cf047bbc9b5 (diff)
downloadrust-e2ebaa1a08aff195487cd7afacdaf7fb0ef62aa7.tar.gz
rust-e2ebaa1a08aff195487cd7afacdaf7fb0ef62aa7.zip
Add `if let` tests
-rw-r--r--tests/ui/nll/match-cfg-fake-edges.rs18
-rw-r--r--tests/ui/nll/match-cfg-fake-edges.stderr72
2 files changed, 80 insertions, 10 deletions
diff --git a/tests/ui/nll/match-cfg-fake-edges.rs b/tests/ui/nll/match-cfg-fake-edges.rs
index e2ba164684f..e349c2c8e2a 100644
--- a/tests/ui/nll/match-cfg-fake-edges.rs
+++ b/tests/ui/nll/match-cfg-fake-edges.rs
@@ -8,13 +8,21 @@ fn all_patterns_are_tested() {
     // Even though `x` is never actually moved out of, we don't want borrowck results to be based on
     // whether MIR lowering reveals which patterns are unreachable.
     let x = String::new();
-    let _ = match true {
+    match true {
         _ => {},
         _ => drop(x),
-    };
+    }
     // Borrowck must not know the second arm is never run.
     drop(x); //~ ERROR use of moved value
 
+    let x = String::new();
+    if let _ = true { //~ WARN irrefutable
+    } else {
+        drop(x)
+    }
+    // Borrowck must not know the else branch is never run.
+    drop(x); //~ ERROR use of moved value
+
     let x = (String::new(), String::new());
     match x {
         (y, _) | (_, y) => (),
@@ -22,6 +30,12 @@ fn all_patterns_are_tested() {
     &x.0; //~ ERROR borrow of moved value
     // Borrowck must not know the second pattern never matches.
     &x.1; //~ ERROR borrow of moved value
+
+    let x = (String::new(), String::new());
+    let ((y, _) | (_, y)) = x;
+    &x.0; //~ ERROR borrow of moved value
+    // Borrowck must not know the second pattern never matches.
+    &x.1; //~ ERROR borrow of moved value
 }
 
 #[rustfmt::skip]
diff --git a/tests/ui/nll/match-cfg-fake-edges.stderr b/tests/ui/nll/match-cfg-fake-edges.stderr
index 2f79c073247..d692ded36fa 100644
--- a/tests/ui/nll/match-cfg-fake-edges.stderr
+++ b/tests/ui/nll/match-cfg-fake-edges.stderr
@@ -1,3 +1,13 @@
+warning: irrefutable `if let` pattern
+  --> $DIR/match-cfg-fake-edges.rs:19:8
+   |
+LL |     if let _ = true {
+   |        ^^^^^^^^^^^^
+   |
+   = note: this pattern will always match, so the `if let` is useless
+   = help: consider replacing the `if let` with a `let`
+   = note: `#[warn(irrefutable_let_patterns)]` on by default
+
 error[E0382]: use of moved value: `x`
   --> $DIR/match-cfg-fake-edges.rs:16:10
    |
@@ -15,8 +25,25 @@ help: consider cloning the value if the performance cost is acceptable
 LL |         _ => drop(x.clone()),
    |                    ++++++++
 
+error[E0382]: use of moved value: `x`
+  --> $DIR/match-cfg-fake-edges.rs:24:10
+   |
+LL |     let x = String::new();
+   |         - move occurs because `x` has type `String`, which does not implement the `Copy` trait
+...
+LL |         drop(x)
+   |              - value moved here
+...
+LL |     drop(x);
+   |          ^ value used here after move
+   |
+help: consider cloning the value if the performance cost is acceptable
+   |
+LL |         drop(x.clone())
+   |               ++++++++
+
 error[E0382]: borrow of moved value: `x.0`
-  --> $DIR/match-cfg-fake-edges.rs:22:5
+  --> $DIR/match-cfg-fake-edges.rs:30:5
    |
 LL |         (y, _) | (_, y) => (),
    |          - value moved here
@@ -31,7 +58,7 @@ LL |         (ref y, _) | (_, y) => (),
    |          +++
 
 error[E0382]: borrow of moved value: `x.1`
-  --> $DIR/match-cfg-fake-edges.rs:24:5
+  --> $DIR/match-cfg-fake-edges.rs:32:5
    |
 LL |         (y, _) | (_, y) => (),
    |                      - value moved here
@@ -45,8 +72,37 @@ help: borrow this binding in the pattern to avoid moving the value
 LL |         (y, _) | (_, ref y) => (),
    |                      +++
 
+error[E0382]: borrow of moved value: `x.0`
+  --> $DIR/match-cfg-fake-edges.rs:36:5
+   |
+LL |     let ((y, _) | (_, y)) = x;
+   |           - value moved here
+LL |     &x.0;
+   |     ^^^^ value borrowed here after move
+   |
+   = note: move occurs because `x.0` has type `String`, which does not implement the `Copy` trait
+help: borrow this binding in the pattern to avoid moving the value
+   |
+LL |     let ((ref y, _) | (_, y)) = x;
+   |           +++
+
+error[E0382]: borrow of moved value: `x.1`
+  --> $DIR/match-cfg-fake-edges.rs:38:5
+   |
+LL |     let ((y, _) | (_, y)) = x;
+   |                       - value moved here
+...
+LL |     &x.1;
+   |     ^^^^ value borrowed here after move
+   |
+   = note: move occurs because `x.1` has type `String`, which does not implement the `Copy` trait
+help: borrow this binding in the pattern to avoid moving the value
+   |
+LL |     let ((y, _) | (_, ref y)) = x;
+   |                       +++
+
 error[E0381]: used binding `x` is possibly-uninitialized
-  --> $DIR/match-cfg-fake-edges.rs:58:19
+  --> $DIR/match-cfg-fake-edges.rs:72:19
    |
 LL |     let x;
    |         - binding declared here but left uninitialized
@@ -57,7 +113,7 @@ LL |         _ => drop(x),
    |         if this pattern is matched, `x` is not initialized
 
 error[E0381]: used binding `x` isn't initialized
-  --> $DIR/match-cfg-fake-edges.rs:65:16
+  --> $DIR/match-cfg-fake-edges.rs:79:16
    |
 LL |     let x;
    |         - binding declared here but left uninitialized
@@ -74,7 +130,7 @@ LL |     let x = 0;
    |           +++
 
 error[E0381]: used binding `x` isn't initialized
-  --> $DIR/match-cfg-fake-edges.rs:72:31
+  --> $DIR/match-cfg-fake-edges.rs:86:31
    |
 LL |     let x;
    |         - binding declared here but left uninitialized
@@ -90,7 +146,7 @@ LL |     let x = 0;
    |           +++
 
 error[E0382]: use of moved value: `x`
-  --> $DIR/match-cfg-fake-edges.rs:85:22
+  --> $DIR/match-cfg-fake-edges.rs:99:22
    |
 LL |     let x = String::new();
    |         - move occurs because `x` has type `String`, which does not implement the `Copy` trait
@@ -107,7 +163,7 @@ LL |         false if { drop(x.clone()); true } => {},
    |                          ++++++++
 
 error[E0382]: use of moved value: `x`
-  --> $DIR/match-cfg-fake-edges.rs:100:22
+  --> $DIR/match-cfg-fake-edges.rs:114:22
    |
 LL |     let x = String::new();
    |         - move occurs because `x` has type `String`, which does not implement the `Copy` trait
@@ -122,7 +178,7 @@ help: consider cloning the value if the performance cost is acceptable
 LL |         false if let Some(()) = { drop(x.clone()); Some(()) } => {},
    |                                         ++++++++
 
-error: aborting due to 8 previous errors
+error: aborting due to 11 previous errors; 1 warning emitted
 
 Some errors have detailed explanations: E0381, E0382.
 For more information about an error, try `rustc --explain E0381`.