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: remove this semicolon to return this value 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` LL | | _ => Box::new(Bar), | | ^^^^^^^^^^^^^ expected struct `Baz`, found struct `Bar` LL | | }; | |_____- `match` arms have incompatible types | = note: expected struct `Box` found struct `Box` 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 { | ------------ 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 { | ----- ^^^^^^^^^^^^ 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`.