Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix invalid silencing of parsing error #123223

Merged
merged 1 commit into from
Apr 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 7 additions & 13 deletions compiler/rustc_parse/src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -698,33 +698,27 @@ impl<'psess, 'src> StringReader<'psess, 'src> {
let expn_data = prefix_span.ctxt().outer_expn_data();

if expn_data.edition >= Edition::Edition2021 {
let mut silence = false;
// In Rust 2021, this is a hard error.
let sugg = if prefix == "rb" {
Some(errors::UnknownPrefixSugg::UseBr(prefix_span))
} else if expn_data.is_root() {
if self.cursor.first() == '\''
&& let Some(start) = self.last_lifetime
&& self.cursor.third() != '\''
&& let end = self.mk_sp(self.pos, self.pos + BytePos(1))
&& !self.psess.source_map().is_multiline(start.until(end))
{
// An "unclosed `char`" error will be emitted already, silence redundant error.
silence = true;
Some(errors::UnknownPrefixSugg::MeantStr {
start,
end: self.mk_sp(self.pos, self.pos + BytePos(1)),
})
// FIXME: An "unclosed `char`" error will be emitted already in some cases,
// but it's hard to silence this error while not also silencing important cases
// too. We should use the error stashing machinery instead.
Some(errors::UnknownPrefixSugg::MeantStr { start, end })
} else {
Some(errors::UnknownPrefixSugg::Whitespace(prefix_span.shrink_to_hi()))
}
} else {
None
};
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);
}
self.dcx().emit_err(errors::UnknownPrefix { span: prefix_span, prefix, sugg });
} else {
// Before Rust 2021, only emit a lint for migration.
self.psess.buffer_lint_with_diagnostic(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//@ edition:2021
macro_rules! a {
( ) => {
impl<'b> c for d {
e::<f'g> //~ ERROR prefix `f` is unknown
}
};
}
fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error: prefix `f` is unknown
--> $DIR/dont-ice-on-invalid-lifetime-in-macro-definition.rs:5:17
|
LL | e::<f'g>
| ^ unknown prefix
|
= note: prefixed identifiers and literals are reserved since Rust 2021
help: consider inserting whitespace here
|
LL | e::<f 'g>
| +

error: aborting due to 1 previous error

3 changes: 2 additions & 1 deletion tests/ui/lexer/lex-bad-str-literal-as-char-3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
//@[rust2021] edition:2021
fn main() {
println!('hello world');
//[rust2015,rust2018,rust2021]~^ ERROR unterminated character literal
//~^ ERROR unterminated character literal
//[rust2021]~| ERROR prefix `world` is unknown
}
14 changes: 13 additions & 1 deletion tests/ui/lexer/lex-bad-str-literal-as-char-3.rust2021.stderr
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
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
--> $DIR/lex-bad-str-literal-as-char-3.rs:5:26
|
Expand All @@ -9,6 +21,6 @@ help: if you meant to write a string literal, use double quotes
LL | println!("hello world");
| ~ ~

error: aborting due to 1 previous error
error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0762`.
9 changes: 9 additions & 0 deletions tests/ui/lexer/lex-bad-str-literal-as-char-4.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//@edition:2021
macro_rules! foo {
() => {
println!('hello world');
//~^ ERROR unterminated character literal
//~| ERROR prefix `world` is unknown
}
}
fn main() {}
26 changes: 26 additions & 0 deletions tests/ui/lexer/lex-bad-str-literal-as-char-4.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
error: prefix `world` is unknown
--> $DIR/lex-bad-str-literal-as-char-4.rs:4:25
|
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
--> $DIR/lex-bad-str-literal-as-char-4.rs:4:30
|
LL | println!('hello world');
| ^^^
|
help: if you meant to write a string literal, use double quotes
|
LL | println!("hello world");
| ~ ~

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0762`.
Loading