Skip to content
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

Some diagnostics improvements of gen blocks #117389

Merged
merged 3 commits into from
Oct 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/rustc_middle/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ middle_assert_coroutine_resume_after_return = coroutine resumed after completion
middle_assert_divide_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 =
misaligned pointer dereference: address must be a multiple of {$required} but is {$found}

Expand Down
3 changes: 1 addition & 2 deletions compiler/rustc_middle/src/mir/terminator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,7 @@ impl<O> AssertKind<O> {
middle_assert_coroutine_resume_after_return
}
ResumedAfterPanic(CoroutineKind::Async(_)) => middle_assert_async_resume_after_panic,
// FIXME(gen_blocks): custom error message for `gen` blocks
ResumedAfterPanic(CoroutineKind::Gen(_)) => middle_assert_async_resume_after_panic,
ResumedAfterPanic(CoroutineKind::Gen(_)) => middle_assert_gen_resume_after_panic,
ResumedAfterPanic(CoroutineKind::Coroutine) => {
middle_assert_coroutine_resume_after_panic
}
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_parse/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,8 @@ parse_found_expr_would_be_stmt = expected expression, found `{$token}`
parse_function_body_equals_expr = function body cannot be `= expression;`
.suggestion = surround the expression with `{"{"}` and `{"}"}` instead of `=` and `;`

parse_gen_block = `gen` blocks are not yet implemented
.help = only the keyword is reserved for now
parse_gen_fn = `gen` functions are not yet implemented
.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

Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_parse/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -521,9 +521,9 @@ pub(crate) struct CatchAfterTry {
}

#[derive(Diagnostic)]
#[diag(parse_gen_block)]
#[diag(parse_gen_fn)]
#[help]
pub(crate) struct GenBlock {
pub(crate) struct GenFn {
#[primary_span]
pub span: Span,
}
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2372,7 +2372,7 @@ impl<'a> Parser<'a> {
}

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) {
Expand Down
26 changes: 26 additions & 0 deletions tests/ui/coroutine/gen_block_panic.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions tests/ui/coroutine/gen_block_panic.stderr
Original file line number Diff line number Diff line change
@@ -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

4 changes: 2 additions & 2 deletions tests/ui/coroutine/gen_fn.e2024.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
error: `gen` blocks are not yet implemented
error: `gen` functions are not yet implemented
--> $DIR/gen_fn.rs:4:1
|
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

2 changes: 1 addition & 1 deletion tests/ui/coroutine/gen_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@

gen fn foo() {}
//[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() {}