Handle ,
to ;
substitution in arg params
This commit is contained in:
parent
6874bd27f5
commit
157c67b7a8
4 changed files with 36 additions and 7 deletions
|
@ -478,6 +478,23 @@ impl<'a> Parser<'a> {
|
||||||
while let Some(arg) = self.parse_angle_arg(ty_generics)? {
|
while let Some(arg) = self.parse_angle_arg(ty_generics)? {
|
||||||
args.push(arg);
|
args.push(arg);
|
||||||
if !self.eat(&token::Comma) {
|
if !self.eat(&token::Comma) {
|
||||||
|
if self.token.kind == token::Semi
|
||||||
|
&& self.look_ahead(1, |t| t.is_ident() || t.is_lifetime())
|
||||||
|
{
|
||||||
|
// Add `>` to the list of expected tokens.
|
||||||
|
self.check(&token::Gt);
|
||||||
|
// Handle `,` to `;` substitution
|
||||||
|
let mut err = self.unexpected::<()>().unwrap_err();
|
||||||
|
self.bump();
|
||||||
|
err.span_suggestion_verbose(
|
||||||
|
self.prev_token.span.until(self.token.span),
|
||||||
|
"use a comma to separate type parameters",
|
||||||
|
", ".to_string(),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
err.emit();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if !self.token.kind.should_end_const_arg() {
|
if !self.token.kind.should_end_const_arg() {
|
||||||
if self.handle_ambiguous_unbraced_const_arg(&mut args)? {
|
if self.handle_ambiguous_unbraced_const_arg(&mut args)? {
|
||||||
// We've managed to (partially) recover, so continue trying to parse
|
// We've managed to (partially) recover, so continue trying to parse
|
||||||
|
|
10
src/test/ui/parser/lifetime-semicolon.fixed
Normal file
10
src/test/ui/parser/lifetime-semicolon.fixed
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// run-rustfix
|
||||||
|
#![allow(unused)]
|
||||||
|
struct Foo<'a, 'b> {
|
||||||
|
a: &'a &'b i32
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo<'a, 'b>(_x: &mut Foo<'a, 'b>) {}
|
||||||
|
//~^ ERROR expected one of `,`, `:`, `=`, or `>`, found `;`
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -1,8 +1,10 @@
|
||||||
|
// run-rustfix
|
||||||
|
#![allow(unused)]
|
||||||
struct Foo<'a, 'b> {
|
struct Foo<'a, 'b> {
|
||||||
a: &'a &'b i32
|
a: &'a &'b i32
|
||||||
}
|
}
|
||||||
|
|
||||||
fn foo<'a, 'b>(x: &mut Foo<'a; 'b>) {}
|
fn foo<'a, 'b>(_x: &mut Foo<'a; 'b>) {}
|
||||||
//~^ ERROR expected one of `,`, `:`, `=`, or `>`, found `;`
|
//~^ ERROR expected one of `,`, `:`, `=`, or `>`, found `;`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
error: expected one of `,`, `:`, `=`, or `>`, found `;`
|
error: expected one of `,`, `:`, `=`, or `>`, found `;`
|
||||||
--> $DIR/lifetime-semicolon.rs:5:30
|
--> $DIR/lifetime-semicolon.rs:7:31
|
||||||
|
|
|
|
||||||
LL | fn foo<'a, 'b>(x: &mut Foo<'a; 'b>) {}
|
LL | fn foo<'a, 'b>(_x: &mut Foo<'a; 'b>) {}
|
||||||
| ^ expected one of `,`, `:`, `=`, or `>`
|
| ^ expected one of `,`, `:`, `=`, or `>`
|
||||||
|
|
|
|
||||||
help: you might have meant to end the type parameters here
|
help: use a comma to separate type parameters
|
||||||
|
|
|
|
||||||
LL | fn foo<'a, 'b>(x: &mut Foo<'a>; 'b>) {}
|
LL | fn foo<'a, 'b>(_x: &mut Foo<'a, 'b>) {}
|
||||||
| +
|
| ~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue