-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement ?
in catch expressions
#40229
Conversation
☔ The latest upstream changes (presumably #40133) made this pull request unmergeable. Please resolve the merge conflicts. |
2513d2a
to
49f5872
Compare
at first read, this all looks good, I'll have to revisit it in more detail when it's rebased |
Ah, a thought. It'd be good to have some tests targeting the CFG etc. The idea would be to have initializations and moves that occur during a let x;
let _v = do catch {
x = 5;
Ok(());
};
println!("{}", x); // OK let x;
let _v = do catch {
x = Ok(5)?;
Ok(());
};
println!("{}", x); // ERROR and similar tests for moves that may or may not occur (and perhaps a few for borrows that start in the catch and extend outside, etc). |
☔ The latest upstream changes (presumably #40220) made this pull request unmergeable. Please resolve the merge conflicts. |
49f5872
to
f435d76
Compare
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
#![feature(catch_expr)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you add a comment on this test explaining what the test aims to demonstrate (e.g., that a borrowed valid inside the do catch
will propagate out?
I also think it'd be good to possibly break this test into distinct files.
let _: Result<(), ()> = do catch { | ||
Err(())?; | ||
cfg_res = 5; | ||
Ok(()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you modify the test to demonstrate that cfg_res
is usable *within the do catch
, if not outside?
Also, add a (run-pass) test like so, where cfg_res
is initialized before the ?
:
pub fn main() {
let cfg_res;
let _: Result<(), ()> = do catch {
cfg_res = 5;
Err(())?;
Ok(())
};
use(cfg_res); // OK
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I would also like some tests around lifetimes like these:
// Test that a borrow which only conditionally occurs still freezes `i`
fn main() {
let mut i = 222;
let j;
let x = do catch {
Err(())?;
Ok(&i)
};
i = 0; // ERROR
println!("{}", i);
}
// Test that a borrow which only conditionally occurs still freezes `i`
fn main() {
let mut i = 222;
let j;
let x = do catch {
Err(())?;
j = &i;
Ok(())
};
i = 0; // ERROR, I ... guess ... maybe not with NLL
println!("{}", i);
}
ab2b758
to
bc07fe6
Compare
@bors r+ |
📌 Commit bc07fe6 has been approved by |
☔ The latest upstream changes (presumably #40598) made this pull request unmergeable. Please resolve the merge conflicts. |
bc07fe6
to
1f43731
Compare
@bors r+ |
📌 Commit 1f43731 has been approved by |
…sakis Implement `?` in catch expressions Builds on rust-lang#39921. Final part of rust-lang#39849. r? @nikomatsakis
⌛ Testing commit 1f43731 with merge 58c701f... |
Builds on #39921. Final part of #39849.
r? @nikomatsakis