Rollup merge of #117389 - oli-obk:gen_fn, r=compiler-errors
Some diagnostics improvements of `gen` blocks These are leftovers from https://github.com/rust-lang/rust/pull/116447
This commit is contained in:
commit
86259e79e4
@ -12,6 +12,8 @@ middle_assert_coroutine_resume_after_return = coroutine resumed after completion
|
|||||||
middle_assert_divide_by_zero =
|
middle_assert_divide_by_zero =
|
||||||
attempt to divide `{$val}` by zero
|
attempt to divide `{$val}` by zero
|
||||||
|
|
||||||
|
middle_assert_gen_resume_after_panic = `gen` fn or block cannot be further iterated on after it panicked
|
||||||
|
|
||||||
middle_assert_misaligned_ptr_deref =
|
middle_assert_misaligned_ptr_deref =
|
||||||
misaligned pointer dereference: address must be a multiple of {$required} but is {$found}
|
misaligned pointer dereference: address must be a multiple of {$required} but is {$found}
|
||||||
|
|
||||||
|
@ -250,8 +250,7 @@ impl<O> AssertKind<O> {
|
|||||||
middle_assert_coroutine_resume_after_return
|
middle_assert_coroutine_resume_after_return
|
||||||
}
|
}
|
||||||
ResumedAfterPanic(CoroutineKind::Async(_)) => middle_assert_async_resume_after_panic,
|
ResumedAfterPanic(CoroutineKind::Async(_)) => middle_assert_async_resume_after_panic,
|
||||||
// FIXME(gen_blocks): custom error message for `gen` blocks
|
ResumedAfterPanic(CoroutineKind::Gen(_)) => middle_assert_gen_resume_after_panic,
|
||||||
ResumedAfterPanic(CoroutineKind::Gen(_)) => middle_assert_async_resume_after_panic,
|
|
||||||
ResumedAfterPanic(CoroutineKind::Coroutine) => {
|
ResumedAfterPanic(CoroutineKind::Coroutine) => {
|
||||||
middle_assert_coroutine_resume_after_panic
|
middle_assert_coroutine_resume_after_panic
|
||||||
}
|
}
|
||||||
|
@ -278,8 +278,8 @@ parse_found_expr_would_be_stmt = expected expression, found `{$token}`
|
|||||||
parse_function_body_equals_expr = function body cannot be `= expression;`
|
parse_function_body_equals_expr = function body cannot be `= expression;`
|
||||||
.suggestion = surround the expression with `{"{"}` and `{"}"}` instead of `=` and `;`
|
.suggestion = surround the expression with `{"{"}` and `{"}"}` instead of `=` and `;`
|
||||||
|
|
||||||
parse_gen_block = `gen` blocks are not yet implemented
|
parse_gen_fn = `gen` functions are not yet implemented
|
||||||
.help = only the keyword is reserved for now
|
.help = for now you can use `gen {"{}"}` blocks and return `impl Iterator` instead
|
||||||
|
|
||||||
parse_generic_args_in_pat_require_turbofish_syntax = generic args in patterns require the turbofish syntax
|
parse_generic_args_in_pat_require_turbofish_syntax = generic args in patterns require the turbofish syntax
|
||||||
|
|
||||||
|
@ -521,9 +521,9 @@ pub(crate) struct CatchAfterTry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parse_gen_block)]
|
#[diag(parse_gen_fn)]
|
||||||
#[help]
|
#[help]
|
||||||
pub(crate) struct GenBlock {
|
pub(crate) struct GenFn {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
@ -2372,7 +2372,7 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Gen::Yes { span, .. } = genness {
|
if let Gen::Yes { span, .. } = genness {
|
||||||
self.sess.emit_err(errors::GenBlock { span });
|
self.sess.emit_err(errors::GenFn { span });
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.eat_keyword_case(kw::Fn, case) {
|
if !self.eat_keyword_case(kw::Fn, case) {
|
||||||
|
26
tests/ui/coroutine/gen_block_panic.rs
Normal file
26
tests/ui/coroutine/gen_block_panic.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
//compile-flags: --edition 2024 -Zunstable-options
|
||||||
|
// run-pass
|
||||||
|
// needs-unwind
|
||||||
|
#![feature(gen_blocks)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut iter = gen {
|
||||||
|
yield 42;
|
||||||
|
panic!("foo");
|
||||||
|
yield 69; //~ WARN: unreachable statement
|
||||||
|
};
|
||||||
|
assert_eq!(iter.next(), Some(42));
|
||||||
|
let mut tmp = std::panic::AssertUnwindSafe(&mut iter);
|
||||||
|
match std::panic::catch_unwind(move || tmp.next()) {
|
||||||
|
Ok(_) => unreachable!(),
|
||||||
|
Err(err) => assert_eq!(*err.downcast::<&'static str>().unwrap(), "foo"),
|
||||||
|
}
|
||||||
|
|
||||||
|
match std::panic::catch_unwind(move || iter.next()) {
|
||||||
|
Ok(_) => unreachable!(),
|
||||||
|
Err(err) => assert_eq!(
|
||||||
|
*err.downcast::<&'static str>().unwrap(),
|
||||||
|
"`gen fn` should just keep returning `None` after panicking",
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
12
tests/ui/coroutine/gen_block_panic.stderr
Normal file
12
tests/ui/coroutine/gen_block_panic.stderr
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
warning: unreachable statement
|
||||||
|
--> $DIR/gen_block_panic.rs:10:9
|
||||||
|
|
|
||||||
|
LL | panic!("foo");
|
||||||
|
| ------------- any code following this expression is unreachable
|
||||||
|
LL | yield 69;
|
||||||
|
| ^^^^^^^^^ unreachable statement
|
||||||
|
|
|
||||||
|
= note: `#[warn(unreachable_code)]` on by default
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
error: `gen` blocks are not yet implemented
|
error: `gen` functions are not yet implemented
|
||||||
--> $DIR/gen_fn.rs:4:1
|
--> $DIR/gen_fn.rs:4:1
|
||||||
|
|
|
|
||||||
LL | gen fn foo() {}
|
LL | gen fn foo() {}
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= help: only the keyword is reserved for now
|
= help: for now you can use `gen {}` blocks and return `impl Iterator` instead
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
|
|
||||||
gen fn foo() {}
|
gen fn foo() {}
|
||||||
//[none]~^ ERROR: expected one of `#`, `async`, `const`, `default`, `extern`, `fn`, `pub`, `unsafe`, or `use`, found `gen`
|
//[none]~^ ERROR: expected one of `#`, `async`, `const`, `default`, `extern`, `fn`, `pub`, `unsafe`, or `use`, found `gen`
|
||||||
//[e2024]~^^ ERROR: `gen` blocks are not yet implemented
|
//[e2024]~^^ ERROR: `gen` functions are not yet implemented
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user