Closed
Description
Due to temporaries in the final expression of a block living longer than the block expression itself, there's actually a difference between a return expression and the final expression in a block. This should be explicitly documented so that we can link to people about it.
Associated Rust issue: rust-lang/rust#21114
Metadata
Metadata
Assignees
Labels
No labels
Activity
pnkfelix commentedon Oct 30, 2018
Its probably worth expanding this issue to also cover the difference between
{ ...; EXPR }
and{ ...; let x = EXPR; x }
.(To which many might say "... there's a difference between those two?" Yes, and its similar to the difference cited in this issues title.)
For the start of a neat test for illustrating this, you might look at the tests I added related to rust-lang/rust#54556, such as https://github.com/rust-lang/rust/blob/master/src/test/ui/nll/issue-54556-stephaneyfx.rs. Its diagnostic output under NLL tries hard to explain what the issue is:
link:
pnkfelix commentedon Nov 9, 2018
See also discussion here: rust-lang/rust#37612 which has examples where you get a deadlock because a temporary is surviving longer than the programmer expected, due to the these rules regarding the dynamic extent of temporaries.