mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #129899 - veera-sivarajan:fix-97793-pr-final, r=chenyukang
Add Suggestions for Misspelled Keywords Fixes #97793 This PR detects misspelled keywords using two heuristics: 1. Lowercasing the unexpected identifier. 2. Using edit distance to find a keyword similar to the unexpected identifier. However, it does not detect each and every misspelled keyword to minimize false positives and ambiguities. More details about the implementation can be found in the comments.
This commit is contained in:
commit
d6a42983e5
@ -381,6 +381,7 @@ parse_invalid_char_in_escape_msg = invalid character in {$is_hex ->
|
|||||||
*[false] unicode
|
*[false] unicode
|
||||||
} escape
|
} escape
|
||||||
|
|
||||||
|
|
||||||
parse_invalid_comparison_operator = invalid comparison operator `{$invalid}`
|
parse_invalid_comparison_operator = invalid comparison operator `{$invalid}`
|
||||||
.use_instead = `{$invalid}` is not a valid comparison operator, use `{$correct}`
|
.use_instead = `{$invalid}` is not a valid comparison operator, use `{$correct}`
|
||||||
.spaceship_operator_invalid = `<=>` is not a valid comparison operator, use `std::cmp::Ordering`
|
.spaceship_operator_invalid = `<=>` is not a valid comparison operator, use `std::cmp::Ordering`
|
||||||
@ -581,6 +582,11 @@ parse_missing_trait_in_trait_impl = missing trait in a trait impl
|
|||||||
.suggestion_add_trait = add a trait here
|
.suggestion_add_trait = add a trait here
|
||||||
.suggestion_remove_for = for an inherent impl, drop this `for`
|
.suggestion_remove_for = for an inherent impl, drop this `for`
|
||||||
|
|
||||||
|
parse_misspelled_kw = {$is_incorrect_case ->
|
||||||
|
[true] write keyword `{$similar_kw}` in lowercase
|
||||||
|
*[false] there is a keyword `{$similar_kw}` with a similar name
|
||||||
|
}
|
||||||
|
|
||||||
parse_modifier_lifetime = `{$modifier}` may only modify trait bounds, not lifetime bounds
|
parse_modifier_lifetime = `{$modifier}` may only modify trait bounds, not lifetime bounds
|
||||||
.suggestion = remove the `{$modifier}`
|
.suggestion = remove the `{$modifier}`
|
||||||
|
|
||||||
|
@ -19,8 +19,9 @@ use rustc_errors::{
|
|||||||
Subdiagnostic,
|
Subdiagnostic,
|
||||||
};
|
};
|
||||||
use rustc_session::errors::ExprParenthesesNeeded;
|
use rustc_session::errors::ExprParenthesesNeeded;
|
||||||
|
use rustc_span::edit_distance::find_best_match_for_name;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, AllKeywords, Ident};
|
||||||
use rustc_span::{BytePos, Span, SpanSnippetError, Symbol, DUMMY_SP};
|
use rustc_span::{BytePos, Span, SpanSnippetError, Symbol, DUMMY_SP};
|
||||||
use thin_vec::{thin_vec, ThinVec};
|
use thin_vec::{thin_vec, ThinVec};
|
||||||
use tracing::{debug, trace};
|
use tracing::{debug, trace};
|
||||||
@ -203,6 +204,37 @@ impl std::fmt::Display for UnaryFixity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, rustc_macros::Subdiagnostic)]
|
||||||
|
#[suggestion(
|
||||||
|
parse_misspelled_kw,
|
||||||
|
applicability = "machine-applicable",
|
||||||
|
code = "{similar_kw}",
|
||||||
|
style = "verbose"
|
||||||
|
)]
|
||||||
|
struct MisspelledKw {
|
||||||
|
similar_kw: String,
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
is_incorrect_case: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks if the given `lookup` identifier is similar to any keyword symbol in `candidates`.
|
||||||
|
fn find_similar_kw(lookup: Ident, candidates: &[Symbol]) -> Option<MisspelledKw> {
|
||||||
|
let lowercase = lookup.name.as_str().to_lowercase();
|
||||||
|
let lowercase_sym = Symbol::intern(&lowercase);
|
||||||
|
if candidates.contains(&lowercase_sym) {
|
||||||
|
Some(MisspelledKw { similar_kw: lowercase, span: lookup.span, is_incorrect_case: true })
|
||||||
|
} else if let Some(similar_sym) = find_best_match_for_name(candidates, lookup.name, None) {
|
||||||
|
Some(MisspelledKw {
|
||||||
|
similar_kw: similar_sym.to_string(),
|
||||||
|
span: lookup.span,
|
||||||
|
is_incorrect_case: false,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct MultiSugg {
|
struct MultiSugg {
|
||||||
msg: String,
|
msg: String,
|
||||||
patches: Vec<(Span, String)>,
|
patches: Vec<(Span, String)>,
|
||||||
@ -638,9 +670,9 @@ impl<'a> Parser<'a> {
|
|||||||
let concat = Symbol::intern(&format!("{prev}{cur}"));
|
let concat = Symbol::intern(&format!("{prev}{cur}"));
|
||||||
let ident = Ident::new(concat, DUMMY_SP);
|
let ident = Ident::new(concat, DUMMY_SP);
|
||||||
if ident.is_used_keyword() || ident.is_reserved() || ident.is_raw_guess() {
|
if ident.is_used_keyword() || ident.is_reserved() || ident.is_raw_guess() {
|
||||||
let span = self.prev_token.span.to(self.token.span);
|
let concat_span = self.prev_token.span.to(self.token.span);
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
span,
|
concat_span,
|
||||||
format!("consider removing the space to spell keyword `{concat}`"),
|
format!("consider removing the space to spell keyword `{concat}`"),
|
||||||
concat,
|
concat,
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
@ -741,9 +773,55 @@ impl<'a> Parser<'a> {
|
|||||||
err.span_label(sp, label_exp);
|
err.span_label(sp, label_exp);
|
||||||
err.span_label(self.token.span, "unexpected token");
|
err.span_label(self.token.span, "unexpected token");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for misspelled keywords if there are no suggestions added to the diagnostic.
|
||||||
|
if err.suggestions.as_ref().is_ok_and(|code_suggestions| code_suggestions.is_empty()) {
|
||||||
|
self.check_for_misspelled_kw(&mut err, &expected);
|
||||||
|
}
|
||||||
Err(err)
|
Err(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks if the current token or the previous token are misspelled keywords
|
||||||
|
/// and adds a helpful suggestion.
|
||||||
|
fn check_for_misspelled_kw(&self, err: &mut Diag<'_>, expected: &[TokenType]) {
|
||||||
|
let Some((curr_ident, _)) = self.token.ident() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let expected_tokens: &[TokenType] =
|
||||||
|
expected.len().checked_sub(10).map_or(&expected, |index| &expected[index..]);
|
||||||
|
let expected_keywords: Vec<Symbol> = expected_tokens
|
||||||
|
.iter()
|
||||||
|
.filter_map(|token| if let TokenType::Keyword(kw) = token { Some(*kw) } else { None })
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// When there are a few keywords in the last ten elements of `self.expected_tokens` and the current
|
||||||
|
// token is an identifier, it's probably a misspelled keyword.
|
||||||
|
// This handles code like `async Move {}`, misspelled `if` in match guard, misspelled `else` in `if`-`else`
|
||||||
|
// and mispelled `where` in a where clause.
|
||||||
|
if !expected_keywords.is_empty()
|
||||||
|
&& !curr_ident.is_used_keyword()
|
||||||
|
&& let Some(misspelled_kw) = find_similar_kw(curr_ident, &expected_keywords)
|
||||||
|
{
|
||||||
|
err.subdiagnostic(misspelled_kw);
|
||||||
|
} else if let Some((prev_ident, _)) = self.prev_token.ident()
|
||||||
|
&& !prev_ident.is_used_keyword()
|
||||||
|
{
|
||||||
|
// We generate a list of all keywords at runtime rather than at compile time
|
||||||
|
// so that it gets generated only when the diagnostic needs it.
|
||||||
|
// Also, it is unlikely that this list is generated multiple times because the
|
||||||
|
// parser halts after execution hits this path.
|
||||||
|
let all_keywords = AllKeywords::new().collect_used(|| prev_ident.span.edition());
|
||||||
|
|
||||||
|
// Otherwise, check the previous token with all the keywords as possible candidates.
|
||||||
|
// This handles code like `Struct Human;` and `While a < b {}`.
|
||||||
|
// We check the previous token only when the current token is an identifier to avoid false
|
||||||
|
// positives like suggesting keyword `for` for `extern crate foo {}`.
|
||||||
|
if let Some(misspelled_kw) = find_similar_kw(prev_ident, &all_keywords) {
|
||||||
|
err.subdiagnostic(misspelled_kw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The user has written `#[attr] expr` which is unsupported. (#106020)
|
/// The user has written `#[attr] expr` which is unsupported. (#106020)
|
||||||
pub(super) fn attr_on_non_tail_expr(&self, expr: &Expr) -> ErrorGuaranteed {
|
pub(super) fn attr_on_non_tail_expr(&self, expr: &Expr) -> ErrorGuaranteed {
|
||||||
// Missing semicolon typo error.
|
// Missing semicolon typo error.
|
||||||
@ -846,6 +924,7 @@ impl<'a> Parser<'a> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err.emit()
|
err.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,8 @@ mod tests;
|
|||||||
|
|
||||||
// The proc macro code for this is in `compiler/rustc_macros/src/symbols.rs`.
|
// The proc macro code for this is in `compiler/rustc_macros/src/symbols.rs`.
|
||||||
symbols! {
|
symbols! {
|
||||||
// If you modify this list, adjust `is_special` and `is_used_keyword`/`is_unused_keyword`.
|
// If you modify this list, adjust `is_special`, `is_used_keyword`/`is_unused_keyword`
|
||||||
|
// and `AllKeywords`.
|
||||||
// But this should rarely be necessary if the keywords are kept in alphabetic order.
|
// But this should rarely be necessary if the keywords are kept in alphabetic order.
|
||||||
Keywords {
|
Keywords {
|
||||||
// Special reserved identifiers used internally for elided lifetimes,
|
// Special reserved identifiers used internally for elided lifetimes,
|
||||||
@ -2579,3 +2580,42 @@ impl Ident {
|
|||||||
self.name.can_be_raw() && self.is_reserved()
|
self.name.can_be_raw() && self.is_reserved()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An iterator over all the keywords in Rust.
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct AllKeywords {
|
||||||
|
curr_idx: u32,
|
||||||
|
end_idx: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AllKeywords {
|
||||||
|
/// Initialize a new iterator over all the keywords.
|
||||||
|
///
|
||||||
|
/// *Note:* Please update this if a new keyword is added beyond the current
|
||||||
|
/// range.
|
||||||
|
pub fn new() -> Self {
|
||||||
|
AllKeywords { curr_idx: kw::Empty.as_u32(), end_idx: kw::Yeet.as_u32() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Collect all the keywords in a given edition into a vector.
|
||||||
|
pub fn collect_used(&self, edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
|
||||||
|
self.filter(|&keyword| {
|
||||||
|
keyword.is_used_keyword_always() || keyword.is_used_keyword_conditional(edition)
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for AllKeywords {
|
||||||
|
type Item = Symbol;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.curr_idx <= self.end_idx {
|
||||||
|
let keyword = Symbol::new(self.curr_idx);
|
||||||
|
self.curr_idx += 1;
|
||||||
|
Some(keyword)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,6 +3,11 @@ error: expected one of `crate` or `{`, found `crte`
|
|||||||
|
|
|
|
||||||
LL | extern crte foo;
|
LL | extern crte foo;
|
||||||
| ^^^^ expected one of `crate` or `{`
|
| ^^^^ expected one of `crate` or `{`
|
||||||
|
|
|
||||||
|
help: there is a keyword `crate` with a similar name
|
||||||
|
|
|
||||||
|
LL | extern crate foo;
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -8,10 +8,16 @@ error: expected one of `:`, `@`, or `|`, found keyword `Self`
|
|||||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:4:17
|
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:4:17
|
||||||
|
|
|
|
||||||
LL | fn foo(&mur Self) {}
|
LL | fn foo(&mur Self) {}
|
||||||
| -----^^^^
|
| ^^^^ expected one of `:`, `@`, or `|`
|
||||||
| | |
|
|
|
||||||
| | expected one of `:`, `@`, or `|`
|
help: there is a keyword `mut` with a similar name
|
||||||
| help: declare the type after the parameter binding: `<identifier>: <type>`
|
|
|
||||||
|
LL | fn foo(&mut Self) {}
|
||||||
|
| ~~~
|
||||||
|
help: declare the type after the parameter binding
|
||||||
|
|
|
||||||
|
LL | fn foo(<identifier>: <type>) {}
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
error: unexpected lifetime `'static` in pattern
|
error: unexpected lifetime `'static` in pattern
|
||||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:8:13
|
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:8:13
|
||||||
@ -35,16 +41,27 @@ error: expected one of `:`, `@`, or `|`, found keyword `Self`
|
|||||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:8:25
|
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:8:25
|
||||||
|
|
|
|
||||||
LL | fn bar(&'static mur Self) {}
|
LL | fn bar(&'static mur Self) {}
|
||||||
| -------------^^^^
|
| ^^^^ expected one of `:`, `@`, or `|`
|
||||||
| | |
|
|
|
||||||
| | expected one of `:`, `@`, or `|`
|
help: there is a keyword `mut` with a similar name
|
||||||
| help: declare the type after the parameter binding: `<identifier>: <type>`
|
|
|
||||||
|
LL | fn bar(&'static mut Self) {}
|
||||||
|
| ~~~
|
||||||
|
help: declare the type after the parameter binding
|
||||||
|
|
|
||||||
|
LL | fn bar(<identifier>: <type>) {}
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
error: expected one of `:`, `@`, or `|`, found keyword `Self`
|
error: expected one of `:`, `@`, or `|`, found keyword `Self`
|
||||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:14:17
|
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:14:17
|
||||||
|
|
|
|
||||||
LL | fn baz(&mur Self @ _) {}
|
LL | fn baz(&mur Self @ _) {}
|
||||||
| ^^^^ expected one of `:`, `@`, or `|`
|
| ^^^^ expected one of `:`, `@`, or `|`
|
||||||
|
|
|
||||||
|
help: there is a keyword `mut` with a similar name
|
||||||
|
|
|
||||||
|
LL | fn baz(&mut Self @ _) {}
|
||||||
|
| ~~~
|
||||||
|
|
||||||
error[E0533]: expected unit struct, found self constructor `Self`
|
error[E0533]: expected unit struct, found self constructor `Self`
|
||||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:4:17
|
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:4:17
|
||||||
|
6
tests/ui/parser/misspelled-keywords/assoc-type.rs
Normal file
6
tests/ui/parser/misspelled-keywords/assoc-type.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
trait Animal {
|
||||||
|
Type Result = u8;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
18
tests/ui/parser/misspelled-keywords/assoc-type.stderr
Normal file
18
tests/ui/parser/misspelled-keywords/assoc-type.stderr
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
error: expected one of `!` or `::`, found `Result`
|
||||||
|
--> $DIR/assoc-type.rs:2:10
|
||||||
|
|
|
||||||
|
LL | trait Animal {
|
||||||
|
| - while parsing this item list starting here
|
||||||
|
LL | Type Result = u8;
|
||||||
|
| ^^^^^^ expected one of `!` or `::`
|
||||||
|
LL |
|
||||||
|
LL | }
|
||||||
|
| - the item list ends here
|
||||||
|
|
|
||||||
|
help: write keyword `type` in lowercase
|
||||||
|
|
|
||||||
|
LL | type Result = u8;
|
||||||
|
| ~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
6
tests/ui/parser/misspelled-keywords/async-move.rs
Normal file
6
tests/ui/parser/misspelled-keywords/async-move.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//@ edition: 2018
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
async Move {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/async-move.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/async-move.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `move`, `|`, or `||`, found `Move`
|
||||||
|
--> $DIR/async-move.rs:4:11
|
||||||
|
|
|
||||||
|
LL | async Move {}
|
||||||
|
| ^^^^ expected one of `move`, `|`, or `||`
|
||||||
|
|
|
||||||
|
help: write keyword `move` in lowercase
|
||||||
|
|
|
||||||
|
LL | async move {}
|
||||||
|
| ~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
5
tests/ui/parser/misspelled-keywords/const-fn.rs
Normal file
5
tests/ui/parser/misspelled-keywords/const-fn.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
cnst fn code() {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/const-fn.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/const-fn.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found keyword `fn`
|
||||||
|
--> $DIR/const-fn.rs:1:6
|
||||||
|
|
|
||||||
|
LL | cnst fn code() {}
|
||||||
|
| ^^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `const` with a similar name
|
||||||
|
|
|
||||||
|
LL | const fn code() {}
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/const-generics.rs
Normal file
4
tests/ui/parser/misspelled-keywords/const-generics.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn foo<consta N: usize>(_arr: [i32; N]) {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/const-generics.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/const-generics.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `,`, `:`, `=`, or `>`, found `N`
|
||||||
|
--> $DIR/const-generics.rs:1:15
|
||||||
|
|
|
||||||
|
LL | fn foo<consta N: usize>(_arr: [i32; N]) {}
|
||||||
|
| ^ expected one of `,`, `:`, `=`, or `>`
|
||||||
|
|
|
||||||
|
help: there is a keyword `const` with a similar name
|
||||||
|
|
|
||||||
|
LL | fn foo<const N: usize>(_arr: [i32; N]) {}
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/const.rs
Normal file
4
tests/ui/parser/misspelled-keywords/const.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
cons A: u8 = 10;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/const.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/const.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `A`
|
||||||
|
--> $DIR/const.rs:1:6
|
||||||
|
|
|
||||||
|
LL | cons A: u8 = 10;
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `const` with a similar name
|
||||||
|
|
|
||||||
|
LL | const A: u8 = 10;
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/for-loop.rs
Normal file
4
tests/ui/parser/misspelled-keywords/for-loop.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
form i in 1..10 {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/for-loop.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/for-loop.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `i`
|
||||||
|
--> $DIR/for-loop.rs:2:10
|
||||||
|
|
|
||||||
|
LL | form i in 1..10 {}
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `for` with a similar name
|
||||||
|
|
|
||||||
|
LL | for i in 1..10 {}
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
16
tests/ui/parser/misspelled-keywords/hrdt.rs
Normal file
16
tests/ui/parser/misspelled-keywords/hrdt.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
struct Closure<F> {
|
||||||
|
data: (u8, u16),
|
||||||
|
func: F,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> Closure<F>
|
||||||
|
Where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
{
|
||||||
|
fn call(&self) -> &u8 {
|
||||||
|
(self.func)(&self.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/hrdt.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/hrdt.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `(`, `+`, `::`, `<`, `where`, or `{`, found keyword `for`
|
||||||
|
--> $DIR/hrdt.rs:7:11
|
||||||
|
|
|
||||||
|
LL | Where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,
|
||||||
|
| ^^^ expected one of 7 possible tokens
|
||||||
|
|
|
||||||
|
help: write keyword `where` in lowercase (notice the capitalization difference)
|
||||||
|
|
|
||||||
|
LL | where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
6
tests/ui/parser/misspelled-keywords/impl-block.rs
Normal file
6
tests/ui/parser/misspelled-keywords/impl-block.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
struct Human;
|
||||||
|
|
||||||
|
ipml Human {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/impl-block.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/impl-block.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `Human`
|
||||||
|
--> $DIR/impl-block.rs:3:6
|
||||||
|
|
|
||||||
|
LL | ipml Human {}
|
||||||
|
| ^^^^^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `impl` with a similar name
|
||||||
|
|
|
||||||
|
LL | impl Human {}
|
||||||
|
| ~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/impl-return.rs
Normal file
4
tests/ui/parser/misspelled-keywords/impl-return.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn code() -> Impl Display {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/impl-return.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/impl-return.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `(`, `+`, `::`, `<`, `where`, or `{`, found `Display`
|
||||||
|
--> $DIR/impl-return.rs:1:19
|
||||||
|
|
|
||||||
|
LL | fn code() -> Impl Display {}
|
||||||
|
| ^^^^^^^ expected one of 7 possible tokens
|
||||||
|
|
|
||||||
|
help: write keyword `impl` in lowercase (notice the capitalization difference)
|
||||||
|
|
|
||||||
|
LL | fn code() -> impl Display {}
|
||||||
|
| ~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
6
tests/ui/parser/misspelled-keywords/impl-trait-for.rs
Normal file
6
tests/ui/parser/misspelled-keywords/impl-trait-for.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
struct Human;
|
||||||
|
|
||||||
|
impl Debug form Human {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/impl-trait-for.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/impl-trait-for.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `(`, `+`, `::`, `<`, `where`, or `{`, found `Human`
|
||||||
|
--> $DIR/impl-trait-for.rs:3:17
|
||||||
|
|
|
||||||
|
LL | impl Debug form Human {}
|
||||||
|
| ^^^^^ expected one of 7 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `for` with a similar name
|
||||||
|
|
|
||||||
|
LL | impl Debug for Human {}
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/impl-trait.rs
Normal file
4
tests/ui/parser/misspelled-keywords/impl-trait.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn code<T: impll Debug>() -> u8 {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
17
tests/ui/parser/misspelled-keywords/impl-trait.stderr
Normal file
17
tests/ui/parser/misspelled-keywords/impl-trait.stderr
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
error: expected one of `(`, `+`, `,`, `::`, `<`, `=`, or `>`, found `Debug`
|
||||||
|
--> $DIR/impl-trait.rs:1:18
|
||||||
|
|
|
||||||
|
LL | fn code<T: impll Debug>() -> u8 {}
|
||||||
|
| ^^^^^ expected one of 7 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `impl` with a similar name
|
||||||
|
|
|
||||||
|
LL | fn code<T: impl Debug>() -> u8 {}
|
||||||
|
| ~~~~
|
||||||
|
help: you might have meant to end the type parameters here
|
||||||
|
|
|
||||||
|
LL | fn code<T: impll> Debug>() -> u8 {}
|
||||||
|
| +
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/let-else.rs
Normal file
4
tests/ui/parser/misspelled-keywords/let-else.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
let Some(a) = Some(10) elze {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/let-else.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/let-else.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `elze`
|
||||||
|
--> $DIR/let-else.rs:2:28
|
||||||
|
|
|
||||||
|
LL | let Some(a) = Some(10) elze {}
|
||||||
|
| ^^^^ expected one of `.`, `;`, `?`, `else`, or an operator
|
||||||
|
|
|
||||||
|
help: there is a keyword `else` with a similar name
|
||||||
|
|
|
||||||
|
LL | let Some(a) = Some(10) else {}
|
||||||
|
| ~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/let-mut.rs
Normal file
4
tests/ui/parser/misspelled-keywords/let-mut.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
let muta a = 10;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/let-mut.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/let-mut.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `:`, `;`, `=`, `@`, or `|`, found `a`
|
||||||
|
--> $DIR/let-mut.rs:2:14
|
||||||
|
|
|
||||||
|
LL | let muta a = 10;
|
||||||
|
| ^ expected one of `:`, `;`, `=`, `@`, or `|`
|
||||||
|
|
|
||||||
|
help: there is a keyword `mut` with a similar name
|
||||||
|
|
|
||||||
|
LL | let mut a = 10;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
9
tests/ui/parser/misspelled-keywords/let.rs
Normal file
9
tests/ui/parser/misspelled-keywords/let.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
fn main() {
|
||||||
|
Let a = 10;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
||||||
|
|
||||||
|
fn code() {
|
||||||
|
lett a = 10;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
24
tests/ui/parser/misspelled-keywords/let.stderr
Normal file
24
tests/ui/parser/misspelled-keywords/let.stderr
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `a`
|
||||||
|
--> $DIR/let.rs:2:9
|
||||||
|
|
|
||||||
|
LL | Let a = 10;
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: write keyword `let` in lowercase
|
||||||
|
|
|
||||||
|
LL | let a = 10;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `a`
|
||||||
|
--> $DIR/let.rs:7:10
|
||||||
|
|
|
||||||
|
LL | lett a = 10;
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `let` with a similar name
|
||||||
|
|
|
||||||
|
LL | let a = 10;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
5
tests/ui/parser/misspelled-keywords/match.rs
Normal file
5
tests/ui/parser/misspelled-keywords/match.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
fn main() {
|
||||||
|
let a = 10;
|
||||||
|
matche a {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/match.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/match.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `a`
|
||||||
|
--> $DIR/match.rs:3:12
|
||||||
|
|
|
||||||
|
LL | matche a {}
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `match` with a similar name
|
||||||
|
|
|
||||||
|
LL | match a {}
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/mod.rs
Normal file
4
tests/ui/parser/misspelled-keywords/mod.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
mode parser;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/mod.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/mod.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `parser`
|
||||||
|
--> $DIR/mod.rs:1:6
|
||||||
|
|
|
||||||
|
LL | mode parser;
|
||||||
|
| ^^^^^^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `mod` with a similar name
|
||||||
|
|
|
||||||
|
LL | mod parser;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
5
tests/ui/parser/misspelled-keywords/pub-fn.rs
Normal file
5
tests/ui/parser/misspelled-keywords/pub-fn.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
puB fn code() {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/pub-fn.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/pub-fn.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `#`, `async`, `auto`, `const`, `default`, `enum`, `extern`, `fn`, `gen`, `impl`, `macro_rules`, `macro`, `mod`, `pub`, `safe`, `static`, `struct`, `trait`, `type`, `unsafe`, or `use`, found `puB`
|
||||||
|
--> $DIR/pub-fn.rs:1:1
|
||||||
|
|
|
||||||
|
LL | puB fn code() {}
|
||||||
|
| ^^^ expected one of 21 possible tokens
|
||||||
|
|
|
||||||
|
help: write keyword `pub` in lowercase
|
||||||
|
|
|
||||||
|
LL | pub fn code() {}
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
9
tests/ui/parser/misspelled-keywords/ref.rs
Normal file
9
tests/ui/parser/misspelled-keywords/ref.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
fn main() {
|
||||||
|
let a = Some(vec![1, 2]);
|
||||||
|
match a {
|
||||||
|
Some(refe list) => println!("{list:?}"),
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
//~| ERROR this pattern has 2 fields,
|
||||||
|
_ => println!("none"),
|
||||||
|
}
|
||||||
|
}
|
27
tests/ui/parser/misspelled-keywords/ref.stderr
Normal file
27
tests/ui/parser/misspelled-keywords/ref.stderr
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
error: expected one of `)`, `,`, `@`, or `|`, found `list`
|
||||||
|
--> $DIR/ref.rs:4:19
|
||||||
|
|
|
||||||
|
LL | Some(refe list) => println!("{list:?}"),
|
||||||
|
| ^^^^ expected one of `)`, `,`, `@`, or `|`
|
||||||
|
|
|
||||||
|
help: there is a keyword `ref` with a similar name
|
||||||
|
|
|
||||||
|
LL | Some(ref list) => println!("{list:?}"),
|
||||||
|
| ~~~
|
||||||
|
help: missing `,`
|
||||||
|
|
|
||||||
|
LL | Some(refe, list) => println!("{list:?}"),
|
||||||
|
| +
|
||||||
|
|
||||||
|
error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 1 field
|
||||||
|
--> $DIR/ref.rs:4:14
|
||||||
|
|
|
||||||
|
LL | Some(refe list) => println!("{list:?}"),
|
||||||
|
| ^^^^ ^^^^ expected 1 field, found 2
|
||||||
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
|
|
||||||
|
= note: tuple variant has 1 field
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0023`.
|
7
tests/ui/parser/misspelled-keywords/return.rs
Normal file
7
tests/ui/parser/misspelled-keywords/return.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fn code() -> u8 {
|
||||||
|
let a = 10;
|
||||||
|
returnn a;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/return.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/return.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `a`
|
||||||
|
--> $DIR/return.rs:3:13
|
||||||
|
|
|
||||||
|
LL | returnn a;
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `return` with a similar name
|
||||||
|
|
|
||||||
|
LL | return a;
|
||||||
|
| ~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
5
tests/ui/parser/misspelled-keywords/static-mut.rs
Normal file
5
tests/ui/parser/misspelled-keywords/static-mut.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
static muta a: u8 = 0;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
//~| ERROR missing type for
|
||||||
|
|
||||||
|
fn main() {}
|
24
tests/ui/parser/misspelled-keywords/static-mut.stderr
Normal file
24
tests/ui/parser/misspelled-keywords/static-mut.stderr
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
error: expected one of `:`, `;`, or `=`, found `a`
|
||||||
|
--> $DIR/static-mut.rs:1:13
|
||||||
|
|
|
||||||
|
LL | static muta a: u8 = 0;
|
||||||
|
| ^ expected one of `:`, `;`, or `=`
|
||||||
|
|
|
||||||
|
help: there is a keyword `mut` with a similar name
|
||||||
|
|
|
||||||
|
LL | static mut a: u8 = 0;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: missing type for `static` item
|
||||||
|
--> $DIR/static-mut.rs:1:12
|
||||||
|
|
|
||||||
|
LL | static muta a: u8 = 0;
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: provide a type for the item
|
||||||
|
|
|
||||||
|
LL | static muta: <type> a: u8 = 0;
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/static.rs
Normal file
4
tests/ui/parser/misspelled-keywords/static.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Static a = 0;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/static.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/static.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `a`
|
||||||
|
--> $DIR/static.rs:1:8
|
||||||
|
|
|
||||||
|
LL | Static a = 0;
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: write keyword `static` in lowercase (notice the capitalization difference)
|
||||||
|
|
|
||||||
|
LL | static a = 0;
|
||||||
|
| ~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/struct.rs
Normal file
4
tests/ui/parser/misspelled-keywords/struct.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Struct Foor {
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
hello: String,
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/struct.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/struct.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `Foor`
|
||||||
|
--> $DIR/struct.rs:1:8
|
||||||
|
|
|
||||||
|
LL | Struct Foor {
|
||||||
|
| ^^^^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: write keyword `struct` in lowercase (notice the capitalization difference)
|
||||||
|
|
|
||||||
|
LL | struct Foor {
|
||||||
|
| ~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/unsafe-fn.rs
Normal file
4
tests/ui/parser/misspelled-keywords/unsafe-fn.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
unsafee fn code() {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/unsafe-fn.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/unsafe-fn.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found keyword `fn`
|
||||||
|
--> $DIR/unsafe-fn.rs:1:9
|
||||||
|
|
|
||||||
|
LL | unsafee fn code() {}
|
||||||
|
| ^^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `unsafe` with a similar name
|
||||||
|
|
|
||||||
|
LL | unsafe fn code() {}
|
||||||
|
| ~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
4
tests/ui/parser/misspelled-keywords/use.rs
Normal file
4
tests/ui/parser/misspelled-keywords/use.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
usee a::b;
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
|
||||||
|
fn main() {}
|
13
tests/ui/parser/misspelled-keywords/use.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/use.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!` or `::`, found `a`
|
||||||
|
--> $DIR/use.rs:1:6
|
||||||
|
|
|
||||||
|
LL | usee a::b;
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
|
||||||
|
help: there is a keyword `use` with a similar name
|
||||||
|
|
|
||||||
|
LL | use a::b;
|
||||||
|
| ~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
8
tests/ui/parser/misspelled-keywords/where-clause.rs
Normal file
8
tests/ui/parser/misspelled-keywords/where-clause.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fn code<T>() -> u8
|
||||||
|
wheree
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
T: Debug,
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
15
tests/ui/parser/misspelled-keywords/where-clause.stderr
Normal file
15
tests/ui/parser/misspelled-keywords/where-clause.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error: expected one of `!`, `(`, `+`, `::`, `<`, `where`, or `{`, found `wheree`
|
||||||
|
--> $DIR/where-clause.rs:2:1
|
||||||
|
|
|
||||||
|
LL | fn code<T>() -> u8
|
||||||
|
| - expected one of 7 possible tokens
|
||||||
|
LL | wheree
|
||||||
|
| ^^^^^^ unexpected token
|
||||||
|
|
|
||||||
|
help: there is a keyword `where` with a similar name
|
||||||
|
|
|
||||||
|
LL | where
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
5
tests/ui/parser/misspelled-keywords/while-loop.rs
Normal file
5
tests/ui/parser/misspelled-keywords/while-loop.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
fn main() {
|
||||||
|
whilee a < b {
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
||||||
|
}
|
13
tests/ui/parser/misspelled-keywords/while-loop.stderr
Normal file
13
tests/ui/parser/misspelled-keywords/while-loop.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `a`
|
||||||
|
--> $DIR/while-loop.rs:2:12
|
||||||
|
|
|
||||||
|
LL | whilee a < b {
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
|
||||||
|
help: there is a keyword `while` with a similar name
|
||||||
|
|
|
||||||
|
LL | while a < b {
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
whilee 2 > 1 {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `2`
|
||||||
|
--> $DIR/while-without-identifiers.rs:2:12
|
||||||
|
|
|
||||||
|
LL | whilee 2 > 1 {}
|
||||||
|
| ^ expected one of 8 possible tokens
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user