about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-02-26 12:03:38 +0000
committerbors <bors@rust-lang.org>2021-02-26 12:03:38 +0000
commitcecdb181ade91c0a5ffab9a148dba68fc7d00ee3 (patch)
tree94e31b206e9c7608b91d5fd05819e4b48760b1db /src/test
parentd95d30486180387a875b14633aea4e4dd8f960da (diff)
parent1d24f07271f7be9f67c7ba7edb7071f58995e294 (diff)
downloadrust-cecdb181ade91c0a5ffab9a148dba68fc7d00ee3.tar.gz
rust-cecdb181ade91c0a5ffab9a148dba68fc7d00ee3.zip
Auto merge of #81458 - estebank:match-stmt-remove-semi, r=oli-obk
Detect match statement intended to be tail expression

CC #24157
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs30
-rw-r--r--src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr51
2 files changed, 81 insertions, 0 deletions
diff --git a/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs
new file mode 100644
index 00000000000..0360ce6e6b8
--- /dev/null
+++ b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs
@@ -0,0 +1,30 @@
+pub trait Foo {}
+
+struct Bar;
+struct Baz;
+
+impl Foo for Bar { }
+impl Foo for Baz { }
+
+fn not_all_paths(a: &str) -> u32 { //~ ERROR mismatched types
+    match a {
+        "baz" => 0,
+        _ => 1,
+    };
+}
+
+fn right(b: &str) -> Box<dyn Foo> {
+    match b {
+        "baz" => Box::new(Baz),
+        _ => Box::new(Bar),
+    }
+}
+
+fn wrong(c: &str) -> Box<dyn Foo> { //~ ERROR mismatched types
+    match c {
+        "baz" => Box::new(Baz),
+        _ => Box::new(Bar), //~ ERROR `match` arms have incompatible types
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr
new file mode 100644
index 00000000000..7dce97468b6
--- /dev/null
+++ b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr
@@ -0,0 +1,51 @@
+error[E0308]: mismatched types
+  --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:9:30
+   |
+LL | fn not_all_paths(a: &str) -> u32 {
+   |    -------------             ^^^ expected `u32`, found `()`
+   |    |
+   |    implicitly returns `()` as its body has no tail or `return` expression
+...
+LL |     };
+   |      - help: consider removing this semicolon
+
+error[E0308]: `match` arms have incompatible types
+  --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:26:14
+   |
+LL | /     match c {
+LL | |         "baz" => Box::new(Baz),
+   | |                  ------------- this is found to be of type `Box<Baz>`
+LL | |         _ => Box::new(Bar),
+   | |              ^^^^^^^^^^^^^ expected struct `Baz`, found struct `Bar`
+LL | |     };
+   | |_____- `match` arms have incompatible types
+   |
+   = note: expected type `Box<Baz>`
+            found struct `Box<Bar>`
+note: you might have meant to return the `match` expression
+  --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:27:6
+   |
+LL |   fn wrong(c: &str) -> Box<dyn Foo> {
+   |                        ------------ the `match` arms can conform to this return type
+LL | /     match c {
+LL | |         "baz" => Box::new(Baz),
+LL | |         _ => Box::new(Bar),
+LL | |     };
+   | |     -^ the `match` is a statement because of this semicolon, consider removing it
+   | |_____|
+   |       this could be implicitly returned but it is a statement, not a tail expression
+
+error[E0308]: mismatched types
+  --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:23:22
+   |
+LL | fn wrong(c: &str) -> Box<dyn Foo> {
+   |    -----             ^^^^^^^^^^^^ expected struct `Box`, found `()`
+   |    |
+   |    implicitly returns `()` as its body has no tail or `return` expression
+   |
+   = note: expected struct `Box<(dyn Foo + 'static)>`
+           found unit type `()`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0308`.