From 44f4f67f460a3b3c9bb34851d3d812fbdba81936 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Mon, 25 Nov 2024 21:50:26 -0700
Subject: fix confusing diagnostic for reserved `##`
---
compiler/rustc_parse/src/errors.rs | 9 +++++++++
compiler/rustc_parse/src/lexer/mod.rs | 16 ++++++++++------
2 files changed, 19 insertions(+), 6 deletions(-)
(limited to 'compiler/rustc_parse/src')
diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs
index 9bdb99dc000..a48725de54b 100644
--- a/compiler/rustc_parse/src/errors.rs
+++ b/compiler/rustc_parse/src/errors.rs
@@ -2151,6 +2151,15 @@ pub(crate) enum UnknownPrefixSugg {
},
}
+#[derive(Diagnostic)]
+#[diag(parse_reserved_multihash)]
+#[note]
+pub(crate) struct ReservedMultihash {
+ #[primary_span]
+ pub span: Span,
+ #[subdiagnostic]
+ pub sugg: Option,
+}
#[derive(Diagnostic)]
#[diag(parse_reserved_string)]
#[note]
diff --git a/compiler/rustc_parse/src/lexer/mod.rs b/compiler/rustc_parse/src/lexer/mod.rs
index 5023e83bd67..787b298c8e4 100644
--- a/compiler/rustc_parse/src/lexer/mod.rs
+++ b/compiler/rustc_parse/src/lexer/mod.rs
@@ -803,7 +803,7 @@ impl<'psess, 'src> StringReader<'psess, 'src> {
let mut cursor = Cursor::new(str_before);
- let (span, unterminated) = match cursor.guarded_double_quoted_string() {
+ let (is_string, span, unterminated) = match cursor.guarded_double_quoted_string() {
Some(rustc_lexer::GuardedStr { n_hashes, terminated, token_len }) => {
let end = start + BytePos(token_len);
let span = self.mk_sp(start, end);
@@ -816,13 +816,13 @@ impl<'psess, 'src> StringReader<'psess, 'src> {
let unterminated = if terminated { None } else { Some(str_start) };
- (span, unterminated)
+ (true, span, unterminated)
}
- _ => {
+ None => {
// We should only get here in the `##+` case.
debug_assert_eq!(self.str_from_to(start, start + BytePos(2)), "##");
- (span, None)
+ (false, span, None)
}
};
if edition2024 {
@@ -844,7 +844,11 @@ impl<'psess, 'src> StringReader<'psess, 'src> {
};
// In Edition 2024 and later, emit a hard error.
- let err = self.dcx().emit_err(errors::ReservedString { span, sugg });
+ let err = if is_string {
+ self.dcx().emit_err(errors::ReservedString { span, sugg })
+ } else {
+ self.dcx().emit_err(errors::ReservedMultihash { span, sugg })
+ };
token::Literal(token::Lit {
kind: token::Err(err),
@@ -857,7 +861,7 @@ impl<'psess, 'src> StringReader<'psess, 'src> {
RUST_2024_GUARDED_STRING_INCOMPATIBLE_SYNTAX,
span,
ast::CRATE_NODE_ID,
- BuiltinLintDiag::ReservedString(space_span),
+ BuiltinLintDiag::ReservedString { is_string, suggestion: space_span },
);
// For backwards compatibility, roll back to after just the first `#`
--
cgit 1.4.1-3-g733a5