This has to do with interplay between tail expressions in a block and temporaries - this reddit thread has a good discussion, so I won't repeat it here.
You can add a semicolon to the match to turn it into a statement. It also turns out Rust 2018 edition yields a much nicer/helpful error message:
error[E0597]: `m` does not live long enough
--> src/lib.rs:6:11
|
6 | match m.lock(){
| ^-------
| |
| borrowed value does not live long enough
| a temporary with access to the borrow is created here ...
...
10 | }
| -
| |
| `m` dropped here while still borrowed
| ... and the borrow might be used here, when that temporary is dropped and runs the destructor for type `std::result::Result<std::sync::MutexGuard<'_, std::option::Option<i32>>, std::sync::PoisonError<std::sync::MutexGuard<'_, std::option::Option<i32>>>>`
|
= note: The temporary is part of an expression at the end of a block. Consider adding semicolon after the expression so its temporaries are dropped sooner, before the local variables declared by the block are dropped.