From 7abf56964f18a4f395feccbc6ae1fd2019754f44 Mon Sep 17 00:00:00 2001 From: b1yd <2156864690@qq.com> Date: Tue, 26 May 2026 14:21:18 +0000 Subject: [PATCH 1/3] fix issue-156949 --- compiler/rustc_resolve/src/late.rs | 25 +++++++++- .../ui/resolve/detect-missing-else-in-let.rs | 11 +++++ .../resolve/detect-missing-else-in-let.stderr | 47 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/ui/resolve/detect-missing-else-in-let.rs create mode 100644 tests/ui/resolve/detect-missing-else-in-let.stderr diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 8c375f6d26611..90ad7abaabdf0 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -765,9 +765,12 @@ pub(crate) struct DiagMetadata<'ast> { /// they are used (in a `break` or `continue` statement) unused_labels: FxIndexMap, - /// Only used for better errors on `let : ;`. + /// Used for better errors on `let : ;`. current_let_binding: Option<(Span, Option, Option)>, + /// Only used for better errors on `let = val{}` when the user forget `else`. + struct_field_parse_failed: bool, + current_pat: Option<&'ast Pat>, /// Used to detect possible `if let` written without `let` and to provide structured suggestion. @@ -4605,6 +4608,20 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { | PathSource::PreciseCapturingArg(..) = source { this.suggest_adding_generic_parameter(path, source) + } else if let Some(Res::Local(_)) = &res + && this.diag_metadata.struct_field_parse_failed + && this.diag_metadata.current_let_binding.is_some() + { + let span = path[0].ident.span.shrink_to_hi(); + ( + Some(( + span, + "try adding `else` here:", + " else ".to_string(), + Applicability::MaybeIncorrect, + )), + None, + ) } else { (None, None) }; @@ -5203,7 +5220,13 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { } ExprKind::Struct(ref se) => { + if let StructRest::NoneWithError(_) = &se.rest + && se.fields.is_empty() + { + self.diag_metadata.struct_field_parse_failed = true; + } self.smart_resolve_path(expr.id, &se.qself, &se.path, PathSource::Struct(parent)); + self.diag_metadata.struct_field_parse_failed = false; // This is the same as `visit::walk_expr(self, expr);`, but we want to pass the // parent in for accurate suggestions when encountering `Foo { bar }` that should // have been `Foo { bar: self.bar }`. diff --git a/tests/ui/resolve/detect-missing-else-in-let.rs b/tests/ui/resolve/detect-missing-else-in-let.rs new file mode 100644 index 0000000000000..c7472f5e4dffd --- /dev/null +++ b/tests/ui/resolve/detect-missing-else-in-let.rs @@ -0,0 +1,11 @@ +// detect missing else in let statement. (issue #135857) +fn main() { + let foo = Some(1); + let Some(a) = foo{return;}; //~ ERROR E0574 + //~| HELP try adding `else` here: + //~| HELP escape `return` to use it as an identifier + //~| ERROR expected identifier, found keyword `return` + let Some(b) = foo{todo!()}; //~ ERROR E0574 + //~| HELP try adding `else` here: + //~| ERROR expected one of `,`, `:`, or `}`, found `!` +} diff --git a/tests/ui/resolve/detect-missing-else-in-let.stderr b/tests/ui/resolve/detect-missing-else-in-let.stderr new file mode 100644 index 0000000000000..48ea7cf96a824 --- /dev/null +++ b/tests/ui/resolve/detect-missing-else-in-let.stderr @@ -0,0 +1,47 @@ +error: expected identifier, found keyword `return` + --> $DIR/detect-missing-else-in-let.rs:4:23 + | +LL | let Some(a) = foo{return;}; + | --- ^^^^^^ expected identifier, found keyword + | | + | while parsing this struct + | +help: escape `return` to use it as an identifier + | +LL | let Some(a) = foo{r#return;}; + | ++ + +error: expected one of `,`, `:`, or `}`, found `!` + --> $DIR/detect-missing-else-in-let.rs:8:27 + | +LL | let Some(b) = foo{todo!()}; + | --- ----^ expected one of `,`, `:`, or `}` + | | | + | | while parsing this struct field + | while parsing this struct + +error[E0574]: expected struct, variant or union type, found local variable `foo` + --> $DIR/detect-missing-else-in-let.rs:4:19 + | +LL | let Some(a) = foo{return;}; + | ^^^ not a struct, variant or union type + | +help: try adding `else` here: + | +LL | let Some(a) = foo else {return;}; + | ++++ + +error[E0574]: expected struct, variant or union type, found local variable `foo` + --> $DIR/detect-missing-else-in-let.rs:8:19 + | +LL | let Some(b) = foo{todo!()}; + | ^^^ not a struct, variant or union type + | +help: try adding `else` here: + | +LL | let Some(b) = foo else {todo!()}; + | ++++ + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0574`. From 6b35075774cebbb15e68760dfa3213f48533e12e Mon Sep 17 00:00:00 2001 From: b1yd <2156864690@qq.com> Date: Mon, 1 Jun 2026 11:52:02 +0800 Subject: [PATCH 2/3] fix --- compiler/rustc_resolve/src/late.rs | 10 +++++-- ...let.rs => detect-missing-else-in-let-1.rs} | 4 +-- ...rr => detect-missing-else-in-let-1.stderr} | 14 ++++++---- .../resolve/detect-missing-else-in-let-2.rs | 10 +++++++ .../detect-missing-else-in-let-2.stderr | 28 +++++++++++++++++++ 5 files changed, 55 insertions(+), 11 deletions(-) rename tests/ui/resolve/{detect-missing-else-in-let.rs => detect-missing-else-in-let-1.rs} (74%) rename tests/ui/resolve/{detect-missing-else-in-let.stderr => detect-missing-else-in-let-1.stderr} (67%) create mode 100644 tests/ui/resolve/detect-missing-else-in-let-2.rs create mode 100644 tests/ui/resolve/detect-missing-else-in-let-2.stderr diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 90ad7abaabdf0..aada85a7be913 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -768,7 +768,7 @@ pub(crate) struct DiagMetadata<'ast> { /// Used for better errors on `let : ;`. current_let_binding: Option<(Span, Option, Option)>, - /// Only used for better errors on `let = val{}` when the user forget `else`. + /// Only used for better errors on `let = val {}` when the user forget `else`. struct_field_parse_failed: bool, current_pat: Option<&'ast Pat>, @@ -4616,7 +4616,10 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { ( Some(( span, - "try adding `else` here:", + "you might have meant to write a diverging block on a refutable `let` \ + statement by using `let-else`\n\ + for more information, visit \ + ", " else ".to_string(), Applicability::MaybeIncorrect, )), @@ -5220,13 +5223,14 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { } ExprKind::Struct(ref se) => { + let struct_field_parse_failed = self.diag_metadata.struct_field_parse_failed; if let StructRest::NoneWithError(_) = &se.rest && se.fields.is_empty() { self.diag_metadata.struct_field_parse_failed = true; } self.smart_resolve_path(expr.id, &se.qself, &se.path, PathSource::Struct(parent)); - self.diag_metadata.struct_field_parse_failed = false; + self.diag_metadata.struct_field_parse_failed = struct_field_parse_failed; // This is the same as `visit::walk_expr(self, expr);`, but we want to pass the // parent in for accurate suggestions when encountering `Foo { bar }` that should // have been `Foo { bar: self.bar }`. diff --git a/tests/ui/resolve/detect-missing-else-in-let.rs b/tests/ui/resolve/detect-missing-else-in-let-1.rs similarity index 74% rename from tests/ui/resolve/detect-missing-else-in-let.rs rename to tests/ui/resolve/detect-missing-else-in-let-1.rs index c7472f5e4dffd..26046eb7c40ac 100644 --- a/tests/ui/resolve/detect-missing-else-in-let.rs +++ b/tests/ui/resolve/detect-missing-else-in-let-1.rs @@ -2,10 +2,10 @@ fn main() { let foo = Some(1); let Some(a) = foo{return;}; //~ ERROR E0574 - //~| HELP try adding `else` here: + //~| HELP you might have meant to write a diverging block //~| HELP escape `return` to use it as an identifier //~| ERROR expected identifier, found keyword `return` let Some(b) = foo{todo!()}; //~ ERROR E0574 - //~| HELP try adding `else` here: + //~| HELP you might have meant to write a diverging block //~| ERROR expected one of `,`, `:`, or `}`, found `!` } diff --git a/tests/ui/resolve/detect-missing-else-in-let.stderr b/tests/ui/resolve/detect-missing-else-in-let-1.stderr similarity index 67% rename from tests/ui/resolve/detect-missing-else-in-let.stderr rename to tests/ui/resolve/detect-missing-else-in-let-1.stderr index 48ea7cf96a824..da37fca4e4498 100644 --- a/tests/ui/resolve/detect-missing-else-in-let.stderr +++ b/tests/ui/resolve/detect-missing-else-in-let-1.stderr @@ -1,5 +1,5 @@ error: expected identifier, found keyword `return` - --> $DIR/detect-missing-else-in-let.rs:4:23 + --> $DIR/detect-missing-else-in-let-1.rs:4:23 | LL | let Some(a) = foo{return;}; | --- ^^^^^^ expected identifier, found keyword @@ -12,7 +12,7 @@ LL | let Some(a) = foo{r#return;}; | ++ error: expected one of `,`, `:`, or `}`, found `!` - --> $DIR/detect-missing-else-in-let.rs:8:27 + --> $DIR/detect-missing-else-in-let-1.rs:8:27 | LL | let Some(b) = foo{todo!()}; | --- ----^ expected one of `,`, `:`, or `}` @@ -21,23 +21,25 @@ LL | let Some(b) = foo{todo!()}; | while parsing this struct error[E0574]: expected struct, variant or union type, found local variable `foo` - --> $DIR/detect-missing-else-in-let.rs:4:19 + --> $DIR/detect-missing-else-in-let-1.rs:4:19 | LL | let Some(a) = foo{return;}; | ^^^ not a struct, variant or union type | -help: try adding `else` here: +help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` + for more information, visit | LL | let Some(a) = foo else {return;}; | ++++ error[E0574]: expected struct, variant or union type, found local variable `foo` - --> $DIR/detect-missing-else-in-let.rs:8:19 + --> $DIR/detect-missing-else-in-let-1.rs:8:19 | LL | let Some(b) = foo{todo!()}; | ^^^ not a struct, variant or union type | -help: try adding `else` here: +help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` + for more information, visit | LL | let Some(b) = foo else {todo!()}; | ++++ diff --git a/tests/ui/resolve/detect-missing-else-in-let-2.rs b/tests/ui/resolve/detect-missing-else-in-let-2.rs new file mode 100644 index 0000000000000..2b12a8c53d1d7 --- /dev/null +++ b/tests/ui/resolve/detect-missing-else-in-let-2.rs @@ -0,0 +1,10 @@ +// the compiler currently will suggest the user to add `else` in this case +// it shouldn't because `bar` is an irrefutable pattern, the else block would never be valid/useful +// it is currently unmitigated +fn main(){ + let foo = 12; + let bar = foo{return;};//~ ERROR E0574 + //~| HELP you might have meant to write a diverging block + //~| HELP escape `return` to use it as an identifier + //~| ERROR expected identifier, found keyword `return` +} diff --git a/tests/ui/resolve/detect-missing-else-in-let-2.stderr b/tests/ui/resolve/detect-missing-else-in-let-2.stderr new file mode 100644 index 0000000000000..f29dfa0db7b07 --- /dev/null +++ b/tests/ui/resolve/detect-missing-else-in-let-2.stderr @@ -0,0 +1,28 @@ +error: expected identifier, found keyword `return` + --> $DIR/detect-missing-else-in-let-2.rs:6:19 + | +LL | let bar = foo{return;}; + | --- ^^^^^^ expected identifier, found keyword + | | + | while parsing this struct + | +help: escape `return` to use it as an identifier + | +LL | let bar = foo{r#return;}; + | ++ + +error[E0574]: expected struct, variant or union type, found local variable `foo` + --> $DIR/detect-missing-else-in-let-2.rs:6:15 + | +LL | let bar = foo{return;}; + | ^^^ not a struct, variant or union type + | +help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` + for more information, visit + | +LL | let bar = foo else {return;}; + | ++++ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0574`. From 0ea7df6b513f43df1d96c63b2d441f16b2c12080 Mon Sep 17 00:00:00 2001 From: byd1 <2156864690@qq.com> Date: Wed, 8 Jul 2026 20:47:31 +0800 Subject: [PATCH 3/3] changed to parser --- compiler/rustc_parse/src/diagnostics.rs | 12 +++++ compiler/rustc_parse/src/parser/expr.rs | 15 +++++- compiler/rustc_parse/src/parser/mod.rs | 3 ++ compiler/rustc_parse/src/parser/stmt.rs | 13 +++-- compiler/rustc_resolve/src/late.rs | 29 +---------- .../ui/parser/detect-missing-else-in-let-1.rs | 8 +++ .../detect-missing-else-in-let-1.stderr | 20 ++++++++ .../detect-missing-else-in-let-2.rs | 4 +- .../detect-missing-else-in-let-2.stderr | 10 +--- .../resolve/detect-missing-else-in-let-1.rs | 11 ----- .../detect-missing-else-in-let-1.stderr | 49 ------------------- 11 files changed, 70 insertions(+), 104 deletions(-) create mode 100644 tests/ui/parser/detect-missing-else-in-let-1.rs create mode 100644 tests/ui/parser/detect-missing-else-in-let-1.stderr rename tests/ui/{resolve => parser}/detect-missing-else-in-let-2.rs (77%) rename tests/ui/{resolve => parser}/detect-missing-else-in-let-2.stderr (66%) delete mode 100644 tests/ui/resolve/detect-missing-else-in-let-1.rs delete mode 100644 tests/ui/resolve/detect-missing-else-in-let-1.stderr diff --git a/compiler/rustc_parse/src/diagnostics.rs b/compiler/rustc_parse/src/diagnostics.rs index c0336cd57603c..288e128a0bc72 100644 --- a/compiler/rustc_parse/src/diagnostics.rs +++ b/compiler/rustc_parse/src/diagnostics.rs @@ -4690,3 +4690,15 @@ pub(crate) struct SuggestIntroduceTypeParameter { pub span: Span, pub parameters: String, } + +#[derive(Subdiagnostic)] +#[suggestion( + "you might have meant to write a diverging block on a refutable `let` statement by using `let-else` + for more information, visit ", + code = " else ", + applicability = "maybe-incorrect" +)] +pub(crate) struct MissingElseInLet { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index e899bf1627681..51dc1aa1f9018 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -3865,7 +3865,7 @@ impl<'a> Parser<'a> { let mut base = ast::StructRest::None; let mut recovered_async = None; let in_if_guard = self.restrictions.contains(Restrictions::IN_IF_GUARD); - + let in_let = self.restrictions.contains(Restrictions::IN_LET); let async_block_err = |e: &mut Diag<'_>, span: Span| { diagnostics::AsyncBlockIn2015 { span }.add_to_diag(e); diagnostics::HelpUseLatestEdition::new().add_to_diag(e); @@ -3954,6 +3954,19 @@ impl<'a> Parser<'a> { return Err(e); } + if in_let { + let mut snapshot = self.create_snapshot_for_diagnostic(); + let might_be_stmt = snapshot.token.is_keyword(kw::Return); + snapshot.recover_stmt(); + snapshot.bump(); + if might_be_stmt && snapshot.eat(exp!(Semi)) { + e.subdiagnostic(diagnostics::MissingElseInLet { + span: pth.span.shrink_to_hi(), + }); + self.restore_snapshot(snapshot); + return Err(e); + } + } let guar = e.emit(); if pth == kw::Async { recovered_async = Some(guar); diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index ecd78fef6e142..7aa2368c99f27 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -125,6 +125,9 @@ bitflags::bitflags! { /// expression, but halts parsing the expression when reaching certain /// tokens like `=`. const IS_PAT = 1 << 5; + /// Used to detect a missing `else` in a let statement. + /// e.g. let Some(foo) = bar{return;}; + const IN_LET = 1 << 6; } } diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs index 27a047f598513..70da778133a18 100644 --- a/compiler/rustc_parse/src/parser/stmt.rs +++ b/compiler/rustc_parse/src/parser/stmt.rs @@ -3,13 +3,12 @@ use std::mem; use std::ops::Bound; use ast::Label; -use rustc_ast as ast; use rustc_ast::token::{self, Delimiter, InvisibleOrigin, MetaVarKind, TokenKind}; use rustc_ast::util::classify::{self, TrailingBrace}; use rustc_ast::visit::{Visitor, walk_expr}; use rustc_ast::{ - AttrStyle, AttrVec, Block, BlockCheckMode, DUMMY_NODE_ID, Expr, ExprKind, HasAttrs, Local, - LocalKind, MacCall, MacCallStmt, MacStmtStyle, Recovered, Stmt, StmtKind, + self as ast, AttrStyle, AttrVec, Block, BlockCheckMode, DUMMY_NODE_ID, Expr, ExprKind, + HasAttrs, Local, LocalKind, MacCall, MacCallStmt, MacStmtStyle, Recovered, Stmt, StmtKind, }; use rustc_errors::{Applicability, Diag, PResult}; use rustc_span::{BytePos, ErrorGuaranteed, Ident, Span, kw, sym}; @@ -494,7 +493,13 @@ impl<'a> Parser<'a> { _ => self.eat(exp!(Eq)), }; - Ok(if eq_consumed || eq_optional { Some(self.parse_expr()?) } else { None }) + Ok(if eq_consumed || eq_optional { + self.current_closure.take(); + let attrs = self.parse_outer_attributes()?; + Some(self.parse_expr_res(Restrictions::IN_LET, attrs).map(|res| res.0)?) + } else { + None + }) } /// Parses a block. No inner attributes are allowed. diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index aada85a7be913..8c375f6d26611 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -765,12 +765,9 @@ pub(crate) struct DiagMetadata<'ast> { /// they are used (in a `break` or `continue` statement) unused_labels: FxIndexMap, - /// Used for better errors on `let : ;`. + /// Only used for better errors on `let : ;`. current_let_binding: Option<(Span, Option, Option)>, - /// Only used for better errors on `let = val {}` when the user forget `else`. - struct_field_parse_failed: bool, - current_pat: Option<&'ast Pat>, /// Used to detect possible `if let` written without `let` and to provide structured suggestion. @@ -4608,23 +4605,6 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { | PathSource::PreciseCapturingArg(..) = source { this.suggest_adding_generic_parameter(path, source) - } else if let Some(Res::Local(_)) = &res - && this.diag_metadata.struct_field_parse_failed - && this.diag_metadata.current_let_binding.is_some() - { - let span = path[0].ident.span.shrink_to_hi(); - ( - Some(( - span, - "you might have meant to write a diverging block on a refutable `let` \ - statement by using `let-else`\n\ - for more information, visit \ - ", - " else ".to_string(), - Applicability::MaybeIncorrect, - )), - None, - ) } else { (None, None) }; @@ -5223,14 +5203,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { } ExprKind::Struct(ref se) => { - let struct_field_parse_failed = self.diag_metadata.struct_field_parse_failed; - if let StructRest::NoneWithError(_) = &se.rest - && se.fields.is_empty() - { - self.diag_metadata.struct_field_parse_failed = true; - } self.smart_resolve_path(expr.id, &se.qself, &se.path, PathSource::Struct(parent)); - self.diag_metadata.struct_field_parse_failed = struct_field_parse_failed; // This is the same as `visit::walk_expr(self, expr);`, but we want to pass the // parent in for accurate suggestions when encountering `Foo { bar }` that should // have been `Foo { bar: self.bar }`. diff --git a/tests/ui/parser/detect-missing-else-in-let-1.rs b/tests/ui/parser/detect-missing-else-in-let-1.rs new file mode 100644 index 0000000000000..9f9d11e558d4c --- /dev/null +++ b/tests/ui/parser/detect-missing-else-in-let-1.rs @@ -0,0 +1,8 @@ +// detect missing else in let statement. (issue #135857) +fn main() { + let foo = Some(1); + let Some(a) = foo{return;}; + //~^ HELP you might have meant to write a diverging block + //~| HELP escape `return` to use it as an identifier + //~| ERROR expected identifier, found keyword `return` +} diff --git a/tests/ui/parser/detect-missing-else-in-let-1.stderr b/tests/ui/parser/detect-missing-else-in-let-1.stderr new file mode 100644 index 0000000000000..2236bb1671464 --- /dev/null +++ b/tests/ui/parser/detect-missing-else-in-let-1.stderr @@ -0,0 +1,20 @@ +error: expected identifier, found keyword `return` + --> $DIR/detect-missing-else-in-let-1.rs:4:23 + | +LL | let Some(a) = foo{return;}; + | --- ^^^^^^ expected identifier, found keyword + | | + | while parsing this struct + | +help: escape `return` to use it as an identifier + | +LL | let Some(a) = foo{r#return;}; + | ++ +help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` + for more information, visit + | +LL | let Some(a) = foo else {return;}; + | ++++ + +error: aborting due to 1 previous error + diff --git a/tests/ui/resolve/detect-missing-else-in-let-2.rs b/tests/ui/parser/detect-missing-else-in-let-2.rs similarity index 77% rename from tests/ui/resolve/detect-missing-else-in-let-2.rs rename to tests/ui/parser/detect-missing-else-in-let-2.rs index 2b12a8c53d1d7..87a5a750bf9f5 100644 --- a/tests/ui/resolve/detect-missing-else-in-let-2.rs +++ b/tests/ui/parser/detect-missing-else-in-let-2.rs @@ -3,8 +3,8 @@ // it is currently unmitigated fn main(){ let foo = 12; - let bar = foo{return;};//~ ERROR E0574 - //~| HELP you might have meant to write a diverging block + let bar = foo{return;}; + //~^ HELP you might have meant to write a diverging block //~| HELP escape `return` to use it as an identifier //~| ERROR expected identifier, found keyword `return` } diff --git a/tests/ui/resolve/detect-missing-else-in-let-2.stderr b/tests/ui/parser/detect-missing-else-in-let-2.stderr similarity index 66% rename from tests/ui/resolve/detect-missing-else-in-let-2.stderr rename to tests/ui/parser/detect-missing-else-in-let-2.stderr index f29dfa0db7b07..5f21c9fe5fa83 100644 --- a/tests/ui/resolve/detect-missing-else-in-let-2.stderr +++ b/tests/ui/parser/detect-missing-else-in-let-2.stderr @@ -10,19 +10,11 @@ help: escape `return` to use it as an identifier | LL | let bar = foo{r#return;}; | ++ - -error[E0574]: expected struct, variant or union type, found local variable `foo` - --> $DIR/detect-missing-else-in-let-2.rs:6:15 - | -LL | let bar = foo{return;}; - | ^^^ not a struct, variant or union type - | help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` for more information, visit | LL | let bar = foo else {return;}; | ++++ -error: aborting due to 2 previous errors +error: aborting due to 1 previous error -For more information about this error, try `rustc --explain E0574`. diff --git a/tests/ui/resolve/detect-missing-else-in-let-1.rs b/tests/ui/resolve/detect-missing-else-in-let-1.rs deleted file mode 100644 index 26046eb7c40ac..0000000000000 --- a/tests/ui/resolve/detect-missing-else-in-let-1.rs +++ /dev/null @@ -1,11 +0,0 @@ -// detect missing else in let statement. (issue #135857) -fn main() { - let foo = Some(1); - let Some(a) = foo{return;}; //~ ERROR E0574 - //~| HELP you might have meant to write a diverging block - //~| HELP escape `return` to use it as an identifier - //~| ERROR expected identifier, found keyword `return` - let Some(b) = foo{todo!()}; //~ ERROR E0574 - //~| HELP you might have meant to write a diverging block - //~| ERROR expected one of `,`, `:`, or `}`, found `!` -} diff --git a/tests/ui/resolve/detect-missing-else-in-let-1.stderr b/tests/ui/resolve/detect-missing-else-in-let-1.stderr deleted file mode 100644 index da37fca4e4498..0000000000000 --- a/tests/ui/resolve/detect-missing-else-in-let-1.stderr +++ /dev/null @@ -1,49 +0,0 @@ -error: expected identifier, found keyword `return` - --> $DIR/detect-missing-else-in-let-1.rs:4:23 - | -LL | let Some(a) = foo{return;}; - | --- ^^^^^^ expected identifier, found keyword - | | - | while parsing this struct - | -help: escape `return` to use it as an identifier - | -LL | let Some(a) = foo{r#return;}; - | ++ - -error: expected one of `,`, `:`, or `}`, found `!` - --> $DIR/detect-missing-else-in-let-1.rs:8:27 - | -LL | let Some(b) = foo{todo!()}; - | --- ----^ expected one of `,`, `:`, or `}` - | | | - | | while parsing this struct field - | while parsing this struct - -error[E0574]: expected struct, variant or union type, found local variable `foo` - --> $DIR/detect-missing-else-in-let-1.rs:4:19 - | -LL | let Some(a) = foo{return;}; - | ^^^ not a struct, variant or union type - | -help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` - for more information, visit - | -LL | let Some(a) = foo else {return;}; - | ++++ - -error[E0574]: expected struct, variant or union type, found local variable `foo` - --> $DIR/detect-missing-else-in-let-1.rs:8:19 - | -LL | let Some(b) = foo{todo!()}; - | ^^^ not a struct, variant or union type - | -help: you might have meant to write a diverging block on a refutable `let` statement by using `let-else` - for more information, visit - | -LL | let Some(b) = foo else {todo!()}; - | ++++ - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0574`.