Skip to content

Commit d016595

Browse files
committed
Add suggestion for removing invalid path separator :: in function definition.
for example: `fn invalid_path_separator::<T>() {}` fixes: rust-lang#130791
1 parent 1b5aa96 commit d016595

6 files changed

+46
-0
lines changed

compiler/rustc_parse/messages.ftl

+3
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ parse_invalid_meta_item = expected unsuffixed literal, found `{$token}`
415415
416416
parse_invalid_offset_of = offset_of expects dot-separated field and variant names
417417
418+
parse_invalid_path_sep_in_fn_definition = invalid path separator in function definition
419+
.suggestion = remove invalid path separator
420+
418421
parse_invalid_unicode_escape = invalid unicode character escape
419422
.label = invalid escape
420423
.help = unicode escape must {$surrogate ->

compiler/rustc_parse/src/errors.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,14 @@ pub(crate) struct MissingFnParams {
17551755
pub span: Span,
17561756
}
17571757

1758+
#[derive(Diagnostic)]
1759+
#[diag(parse_invalid_path_sep_in_fn_definition)]
1760+
pub(crate) struct InvalidPathSepInFnDefinition {
1761+
#[primary_span]
1762+
#[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1763+
pub span: Span,
1764+
}
1765+
17581766
#[derive(Diagnostic)]
17591767
#[diag(parse_missing_trait_in_trait_impl)]
17601768
pub(crate) struct MissingTraitInTraitImpl {

compiler/rustc_parse/src/parser/generics.rs

+7
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,13 @@ impl<'a> Parser<'a> {
269269
/// | ( < lifetimes , typaramseq ( , )? > )
270270
/// where typaramseq = ( typaram ) | ( typaram , typaramseq )
271271
pub(super) fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
272+
// invalid path separator `::` in function definition
273+
// for example `fn invalid_path_separator::<T>() {}`
274+
if self.eat_noexpect(&token::PathSep) {
275+
self.dcx()
276+
.emit_err(errors::InvalidPathSepInFnDefinition { span: self.prev_token.span });
277+
}
278+
272279
let span_lo = self.token.span;
273280
let (params, span) = if self.eat_lt() {
274281
let params = self.parse_generic_params()?;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//@ run-rustfix
2+
3+
#[allow(dead_code)]
4+
fn invalid_path_separator<T>() {}
5+
//~^ ERROR invalid path separator in function definition
6+
7+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//@ run-rustfix
2+
3+
#[allow(dead_code)]
4+
fn invalid_path_separator::<T>() {}
5+
//~^ ERROR invalid path separator in function definition
6+
7+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: invalid path separator in function definition
2+
--> $DIR/invalid-path-sep-in-fn-definition-issue-130791.rs:4:26
3+
|
4+
LL | fn invalid_path_separator::<T>() {}
5+
| ^^
6+
|
7+
help: remove invalid path separator
8+
|
9+
LL - fn invalid_path_separator::<T>() {}
10+
LL + fn invalid_path_separator<T>() {}
11+
|
12+
13+
error: aborting due to 1 previous error
14+

0 commit comments

Comments
 (0)