Only error raw lifetime followed by \' in edition 2021+
This commit is contained in:
parent
b87e935407
commit
d878fd8877
3 changed files with 28 additions and 5 deletions
|
@ -300,6 +300,26 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
|
||||||
let prefix_span = self.mk_sp(start, ident_start);
|
let prefix_span = self.mk_sp(start, ident_start);
|
||||||
|
|
||||||
if prefix_span.at_least_rust_2021() {
|
if prefix_span.at_least_rust_2021() {
|
||||||
|
// If the raw lifetime is followed by \' then treat it a normal
|
||||||
|
// lifetime followed by a \', which is to interpret it as a character
|
||||||
|
// literal. In this case, it's always an invalid character literal
|
||||||
|
// since the literal must necessarily have >3 characters (r#...) inside
|
||||||
|
// of it, which is invalid.
|
||||||
|
if self.cursor.as_str().starts_with('\'') {
|
||||||
|
let lit_span = self.mk_sp(start, self.pos + BytePos(1));
|
||||||
|
let contents = self.str_from_to(start + BytePos(1), self.pos);
|
||||||
|
emit_unescape_error(
|
||||||
|
self.dcx(),
|
||||||
|
contents,
|
||||||
|
lit_span,
|
||||||
|
lit_span,
|
||||||
|
Mode::Char,
|
||||||
|
0..contents.len(),
|
||||||
|
EscapeError::MoreThanOneChar,
|
||||||
|
)
|
||||||
|
.expect("expected error");
|
||||||
|
}
|
||||||
|
|
||||||
let span = self.mk_sp(start, self.pos);
|
let span = self.mk_sp(start, self.pos);
|
||||||
|
|
||||||
let lifetime_name_without_tick =
|
let lifetime_name_without_tick =
|
||||||
|
@ -371,8 +391,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
|
||||||
rustc_lexer::TokenKind::Caret => token::BinOp(token::Caret),
|
rustc_lexer::TokenKind::Caret => token::BinOp(token::Caret),
|
||||||
rustc_lexer::TokenKind::Percent => token::BinOp(token::Percent),
|
rustc_lexer::TokenKind::Percent => token::BinOp(token::Percent),
|
||||||
|
|
||||||
rustc_lexer::TokenKind::Unknown
|
rustc_lexer::TokenKind::Unknown | rustc_lexer::TokenKind::InvalidIdent => {
|
||||||
| rustc_lexer::TokenKind::InvalidIdent => {
|
|
||||||
// Don't emit diagnostics for sequences of the same invalid token
|
// Don't emit diagnostics for sequences of the same invalid token
|
||||||
if swallow_next_invalid > 0 {
|
if swallow_next_invalid > 0 {
|
||||||
swallow_next_invalid -= 1;
|
swallow_next_invalid -= 1;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: character literal may only contain one codepoint
|
error: character literal may only contain one codepoint
|
||||||
--> $DIR/immediately-followed-by-lt.rs:11:4
|
--> $DIR/immediately-followed-by-lt.rs:15:4
|
||||||
|
|
|
|
||||||
LL | w!('r#long'id);
|
LL | w!('r#long'id);
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
|
@ -1,4 +1,8 @@
|
||||||
//@ edition: 2021
|
//@ revisions: e2015 e2021
|
||||||
|
|
||||||
|
//@[e2021] edition: 2021
|
||||||
|
//@[e2015] edition: 2015
|
||||||
|
//@[e2015] check-pass
|
||||||
|
|
||||||
// Make sure we reject the case where a raw lifetime is immediately followed by another
|
// Make sure we reject the case where a raw lifetime is immediately followed by another
|
||||||
// lifetime. This reserves a modest amount of space for changing lexing to, for example,
|
// lifetime. This reserves a modest amount of space for changing lexing to, for example,
|
||||||
|
@ -9,6 +13,6 @@ macro_rules! w {
|
||||||
}
|
}
|
||||||
|
|
||||||
w!('r#long'id);
|
w!('r#long'id);
|
||||||
//~^ ERROR character literal may only contain one codepoint
|
//[e2021]~^ ERROR character literal may only contain one codepoint
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue