Silence redundant error on char literal that was meant to be a string in 2021 edition

This commit is contained in:
Esteban Küber 2024-03-14 00:40:25 +00:00
parent 6f388ef1fb
commit ea1883d7b2
4 changed files with 20 additions and 15 deletions

View File

@ -59,6 +59,15 @@ pub(crate) fn second(&self) -> char {
iter.next().unwrap_or(EOF_CHAR) iter.next().unwrap_or(EOF_CHAR)
} }
/// Peeks the third symbol from the input stream without consuming it.
pub fn third(&self) -> char {
// `.next()` optimizes better than `.nth(1)`
let mut iter = self.chars.clone();
iter.next();
iter.next();
iter.next().unwrap_or(EOF_CHAR)
}
/// Checks if there is nothing more to consume. /// Checks if there is nothing more to consume.
pub(crate) fn is_eof(&self) -> bool { pub(crate) fn is_eof(&self) -> bool {
self.chars.as_str().is_empty() self.chars.as_str().is_empty()

View File

@ -698,13 +698,17 @@ fn report_unknown_prefix(&self, start: BytePos) {
let expn_data = prefix_span.ctxt().outer_expn_data(); let expn_data = prefix_span.ctxt().outer_expn_data();
if expn_data.edition >= Edition::Edition2021 { if expn_data.edition >= Edition::Edition2021 {
let mut silence = false;
// In Rust 2021, this is a hard error. // In Rust 2021, this is a hard error.
let sugg = if prefix == "rb" { let sugg = if prefix == "rb" {
Some(errors::UnknownPrefixSugg::UseBr(prefix_span)) Some(errors::UnknownPrefixSugg::UseBr(prefix_span))
} else if expn_data.is_root() { } else if expn_data.is_root() {
if self.cursor.first() == '\'' if self.cursor.first() == '\''
&& let Some(start) = self.last_lifetime && let Some(start) = self.last_lifetime
&& self.cursor.third() != '\''
{ {
// An "unclosed `char`" error will be emitted already, silence redundant error.
silence = true;
Some(errors::UnknownPrefixSugg::MeantStr { Some(errors::UnknownPrefixSugg::MeantStr {
start, start,
end: self.mk_sp(self.pos, self.pos + BytePos(1)), end: self.mk_sp(self.pos, self.pos + BytePos(1)),
@ -715,7 +719,12 @@ fn report_unknown_prefix(&self, start: BytePos) {
} else { } else {
None None
}; };
self.dcx().emit_err(errors::UnknownPrefix { span: prefix_span, prefix, sugg }); let err = errors::UnknownPrefix { span: prefix_span, prefix, sugg };
if silence {
self.dcx().create_err(err).delay_as_bug();
} else {
self.dcx().emit_err(err);
}
} else { } else {
// Before Rust 2021, only emit a lint for migration. // Before Rust 2021, only emit a lint for migration.
self.psess.buffer_lint_with_diagnostic( self.psess.buffer_lint_with_diagnostic(

View File

@ -4,5 +4,4 @@
fn main() { fn main() {
println!('hello world'); println!('hello world');
//[rust2015,rust2018,rust2021]~^ ERROR unterminated character literal //[rust2015,rust2018,rust2021]~^ ERROR unterminated character literal
//[rust2021]~^^ ERROR prefix `world` is unknown
} }

View File

@ -1,15 +1,3 @@
error: prefix `world` is unknown
--> $DIR/lex-bad-str-literal-as-char-3.rs:5:21
|
LL | println!('hello world');
| ^^^^^ unknown prefix
|
= note: prefixed identifiers and literals are reserved since Rust 2021
help: if you meant to write a string literal, use double quotes
|
LL | println!("hello world");
| ~ ~
error[E0762]: unterminated character literal error[E0762]: unterminated character literal
--> $DIR/lex-bad-str-literal-as-char-3.rs:5:26 --> $DIR/lex-bad-str-literal-as-char-3.rs:5:26
| |
@ -21,6 +9,6 @@ help: if you meant to write a string literal, use double quotes
LL | println!("hello world"); LL | println!("hello world");
| ~ ~ | ~ ~
error: aborting due to 2 previous errors error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0762`. For more information about this error, try `rustc --explain E0762`.