Lint against keyword lifetimes in keyword_idents
This commit is contained in:
parent
afa24f0180
commit
5054e8cba8
5 changed files with 43 additions and 7 deletions
|
@ -1851,9 +1851,16 @@ impl KeywordIdents {
|
||||||
TokenTree::Token(token, _) => {
|
TokenTree::Token(token, _) => {
|
||||||
if let Some((ident, token::IdentIsRaw::No)) = token.ident() {
|
if let Some((ident, token::IdentIsRaw::No)) = token.ident() {
|
||||||
if !prev_dollar {
|
if !prev_dollar {
|
||||||
self.check_ident_token(cx, UnderMacro(true), ident);
|
self.check_ident_token(cx, UnderMacro(true), ident, "");
|
||||||
}
|
}
|
||||||
} else if *token == TokenKind::Dollar {
|
} else if let Some((ident, token::IdentIsRaw::No)) = token.lifetime() {
|
||||||
|
self.check_ident_token(
|
||||||
|
cx,
|
||||||
|
UnderMacro(true),
|
||||||
|
ident.without_first_quote(),
|
||||||
|
"'",
|
||||||
|
);
|
||||||
|
} else if token.kind == TokenKind::Dollar {
|
||||||
prev_dollar = true;
|
prev_dollar = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1869,6 +1876,7 @@ impl KeywordIdents {
|
||||||
cx: &EarlyContext<'_>,
|
cx: &EarlyContext<'_>,
|
||||||
UnderMacro(under_macro): UnderMacro,
|
UnderMacro(under_macro): UnderMacro,
|
||||||
ident: Ident,
|
ident: Ident,
|
||||||
|
prefix: &'static str,
|
||||||
) {
|
) {
|
||||||
let (lint, edition) = match ident.name {
|
let (lint, edition) = match ident.name {
|
||||||
kw::Async | kw::Await | kw::Try => (KEYWORD_IDENTS_2018, Edition::Edition2018),
|
kw::Async | kw::Await | kw::Try => (KEYWORD_IDENTS_2018, Edition::Edition2018),
|
||||||
|
@ -1902,7 +1910,7 @@ impl KeywordIdents {
|
||||||
cx.emit_span_lint(
|
cx.emit_span_lint(
|
||||||
lint,
|
lint,
|
||||||
ident.span,
|
ident.span,
|
||||||
BuiltinKeywordIdents { kw: ident, next: edition, suggestion: ident.span },
|
BuiltinKeywordIdents { kw: ident, next: edition, suggestion: ident.span, prefix },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1915,7 +1923,11 @@ impl EarlyLintPass for KeywordIdents {
|
||||||
self.check_tokens(cx, &mac.args.tokens);
|
self.check_tokens(cx, &mac.args.tokens);
|
||||||
}
|
}
|
||||||
fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: Ident) {
|
fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: Ident) {
|
||||||
self.check_ident_token(cx, UnderMacro(false), ident);
|
if ident.name.as_str().starts_with('\'') {
|
||||||
|
self.check_ident_token(cx, UnderMacro(false), ident.without_first_quote(), "'");
|
||||||
|
} else {
|
||||||
|
self.check_ident_token(cx, UnderMacro(false), ident, "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -363,8 +363,9 @@ pub(crate) enum BuiltinEllipsisInclusiveRangePatternsLint {
|
||||||
pub(crate) struct BuiltinKeywordIdents {
|
pub(crate) struct BuiltinKeywordIdents {
|
||||||
pub kw: Ident,
|
pub kw: Ident,
|
||||||
pub next: Edition,
|
pub next: Edition,
|
||||||
#[suggestion(code = "r#{kw}", applicability = "machine-applicable")]
|
#[suggestion(code = "{prefix}r#{kw}", applicability = "machine-applicable")]
|
||||||
pub suggestion: Span,
|
pub suggestion: Span,
|
||||||
|
pub prefix: &'static str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
|
|
|
@ -31,5 +31,14 @@ LL | () => { mod test { fn gen() {} } }
|
||||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024!
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024!
|
||||||
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: `gen` is a keyword in the 2024 edition
|
||||||
|
--> $DIR/gen-kw.rs:25:9
|
||||||
|
|
|
||||||
|
LL | fn test<'gen>() {}
|
||||||
|
| ^^^^ help: you can use a raw identifier to stay compatible: `'r#gen`
|
||||||
|
|
|
||||||
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024!
|
||||||
|
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
|
|
@ -31,5 +31,14 @@ LL | () => { mod test { fn gen() {} } }
|
||||||
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
||||||
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: `gen` is a keyword in the 2024 edition
|
||||||
|
--> $DIR/gen-kw.rs:25:9
|
||||||
|
|
|
||||||
|
LL | fn test<'gen>() {}
|
||||||
|
| ^^^^ help: you can use a raw identifier to stay compatible: `'r#gen`
|
||||||
|
|
|
||||||
|
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
||||||
|
= note: for more information, see issue #49716 <https://github.com/rust-lang/rust/issues/49716>
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
|
|
@ -22,4 +22,9 @@ macro_rules! t {
|
||||||
//[e2018]~| WARNING this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
//[e2018]~| WARNING this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test<'gen>() {}
|
||||||
|
//~^ ERROR `gen` is a keyword in the 2024 edition
|
||||||
|
//[e2015]~| WARNING this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024!
|
||||||
|
//[e2018]~| WARNING this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2024!
|
||||||
|
|
||||||
t!();
|
t!();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue