Skip to content

Commit

Permalink
Fix invalid silencing of parsing error
Browse files Browse the repository at this point in the history
Given

```rust
macro_rules! a {
    ( ) => {
        impl<'b> c for d {
            e::<f'g>
        }
    };
}
```

ensure an error is emitted.

Fix #123079.
  • Loading branch information
estebank committed Apr 7, 2024
1 parent e78913b commit e572a19
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 15 deletions.
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`.

0 comments on commit e572a19

Please sign in to comment.