diff options
| author | bors <bors@rust-lang.org> | 2022-09-15 15:19:40 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-15 15:19:40 +0000 |
| commit | 35a0407814a6b5a04f0929105631e9c69e293e9d (patch) | |
| tree | 8e8ab0230130faf7dbe38a997deb1cde8d019b18 /src/test | |
| parent | 294f0eef736aa13cadf28ce7160a18a94ca7b87c (diff) | |
| parent | 4a5d2a561c6f82f928d6f14fe6e8f9ad2415b9a8 (diff) | |
Auto merge of #101410 - dingxiangfei2009:fix-let-else-scoping, r=jackh726
Reorder nesting scopes and declare bindings without drop schedule Fix #99228 Fix #99975 Storages are previously not declared before entering the `else` block of a `let .. else` statement. However, when breaking out of the pattern matching into the `else` block, those storages are recorded as scheduled for drops. This is not expected. This MR fixes this issue by not scheduling the drops for those storages. cc `@est31`
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/let-else/issue-99975.rs | 20 | ||||
| -rw-r--r-- | src/test/ui/let-else/let-else-temporary-lifetime.rs | 1 |
3 files changed, 22 insertions, 1 deletions
diff --git a/src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr b/src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr index 435cc845870..7f93563e288 100644 --- a/src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr +++ b/src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr @@ -35,7 +35,7 @@ LL | bar2(Rc::new(())).await | | | has type `Rc<()>` which is not `Send` LL | }; - | - `Rc::new(())` is later dropped here + | - `Rc::new(())` is later dropped here note: required by a bound in `is_send` --> $DIR/async-await-let-else.rs:19:15 | diff --git a/src/test/ui/let-else/issue-99975.rs b/src/test/ui/let-else/issue-99975.rs new file mode 100644 index 00000000000..80f63556194 --- /dev/null +++ b/src/test/ui/let-else/issue-99975.rs @@ -0,0 +1,20 @@ +// run-pass +// compile-flags: -C opt-level=3 -Zvalidate-mir + +#![feature(let_else)] + +fn return_result() -> Option<String> { + Some("ok".to_string()) +} + +fn start() -> String { + let Some(content) = return_result() else { + return "none".to_string() + }; + + content +} + +fn main() { + start(); +} diff --git a/src/test/ui/let-else/let-else-temporary-lifetime.rs b/src/test/ui/let-else/let-else-temporary-lifetime.rs index 07fcc16e7bb..8542c3496b0 100644 --- a/src/test/ui/let-else/let-else-temporary-lifetime.rs +++ b/src/test/ui/let-else/let-else-temporary-lifetime.rs @@ -1,4 +1,5 @@ // run-pass +// compile-flags: -Zvalidate-mir #![feature(let_else)] use std::fmt::Display; |
