diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-01-27 10:48:46 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-27 10:48:46 +0100 |
| commit | 9a4417659e60a677f3dc0204c28cedfc6a6e4d91 (patch) | |
| tree | 3e183cd47492d7ec85c5ac5e38ea18d81b9c3452 /compiler/rustc_parse/src/parser | |
| parent | 04521fd10e6eefb113ca1cefd02862599fd08640 (diff) | |
| parent | a5d9def321df76de6fb90ed836bf062b557636d6 (diff) | |
| download | rust-9a4417659e60a677f3dc0204c28cedfc6a6e4d91.tar.gz rust-9a4417659e60a677f3dc0204c28cedfc6a6e4d91.zip | |
Rollup merge of #118182 - estebank:issue-118164, r=davidtwco
Properly recover from trailing attr in body When encountering an attribute in a body, we try to recover from an attribute on an expression (as opposed to a statement). We need to properly clean up when the attribute is at the end of the body where a tail expression would be. Fix #118164, fix #118575.
Diffstat (limited to 'compiler/rustc_parse/src/parser')
| -rw-r--r-- | compiler/rustc_parse/src/parser/diagnostics.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index dd9157564db..7a24b819b5f 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -791,13 +791,28 @@ impl<'a> Parser<'a> { && let [segment] = &attr_kind.item.path.segments[..] && segment.ident.name == sym::cfg && let Some(args_span) = attr_kind.item.args.span() - && let Ok(next_attr) = snapshot.parse_attribute(InnerAttrPolicy::Forbidden(None)) + && let next_attr = match snapshot.parse_attribute(InnerAttrPolicy::Forbidden(None)) + { + Ok(next_attr) => next_attr, + Err(inner_err) => { + err.cancel(); + inner_err.cancel(); + return; + } + } && let ast::AttrKind::Normal(next_attr_kind) = next_attr.kind && let Some(next_attr_args_span) = next_attr_kind.item.args.span() && let [next_segment] = &next_attr_kind.item.path.segments[..] && segment.ident.name == sym::cfg - && let Ok(next_expr) = snapshot.parse_expr() { + let next_expr = match snapshot.parse_expr() { + Ok(next_expr) => next_expr, + Err(inner_err) => { + err.cancel(); + inner_err.cancel(); + return; + } + }; // We have for sure // #[cfg(..)] // expr |
