diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-03-17 22:54:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-17 22:54:59 +0100 |
| commit | c8133f6f5e7de007e2568a3ef8fbb2e96075411e (patch) | |
| tree | 60bf59343424150cdb0503cee64bf9afaaee0ab0 /compiler/rustc_parse | |
| parent | 58f11791af4f97572e7afd83f11cffe04bbbd12f (diff) | |
| parent | 3a13a721418b53ee6ca4c24fdbd17cc136ebcebb (diff) | |
| download | rust-c8133f6f5e7de007e2568a3ef8fbb2e96075411e.tar.gz rust-c8133f6f5e7de007e2568a3ef8fbb2e96075411e.zip | |
Rollup merge of #91133 - terrarier2111:unsafe-diagnostic, r=jackh726
Improve `unsafe` diagnostic This fixes: https://github.com/rust-lang/rust/issues/90880 I didn't use the exact proposed messages though.
Diffstat (limited to 'compiler/rustc_parse')
| -rw-r--r-- | compiler/rustc_parse/src/parser/item.rs | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs index b582f060395..a485d12b0c0 100644 --- a/compiler/rustc_parse/src/parser/item.rs +++ b/compiler/rustc_parse/src/parser/item.rs @@ -999,10 +999,32 @@ impl<'a> Parser<'a> { attrs: &mut Vec<Attribute>, unsafety: Unsafe, ) -> PResult<'a, ItemInfo> { + let sp_start = self.prev_token.span; let abi = self.parse_abi(); // ABI? - let items = self.parse_item_list(attrs, |p| p.parse_foreign_item(ForceCollect::No))?; - let module = ast::ForeignMod { unsafety, abi, items }; - Ok((Ident::empty(), ItemKind::ForeignMod(module))) + match self.parse_item_list(attrs, |p| p.parse_foreign_item(ForceCollect::No)) { + Ok(items) => { + let module = ast::ForeignMod { unsafety, abi, items }; + Ok((Ident::empty(), ItemKind::ForeignMod(module))) + } + Err(mut err) => { + let current_qual_sp = self.prev_token.span; + let current_qual_sp = current_qual_sp.to(sp_start); + if let Ok(current_qual) = self.span_to_snippet(current_qual_sp) { + if err.message() == "expected `{`, found keyword `unsafe`" { + let invalid_qual_sp = self.token.uninterpolated_span(); + let invalid_qual = self.span_to_snippet(invalid_qual_sp).unwrap(); + + err.span_suggestion( + current_qual_sp.to(invalid_qual_sp), + &format!("`{}` must come before `{}`", invalid_qual, current_qual), + format!("{} {}", invalid_qual, current_qual), + Applicability::MachineApplicable, + ).note("keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`"); + } + } + Err(err) + } + } } /// Parses a foreign item (one in an `extern { ... }` block). |
