Skip to content

Commit

Permalink
Parser: recover from ::: to :: in delegations
Browse files Browse the repository at this point in the history
  • Loading branch information
GrigorenkoPV committed Sep 21, 2024
1 parent e90e259 commit 82482dc
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -707,7 +707,7 @@ impl<'a> Parser<'a> {
})
};

let (ident, item_kind) = if self.eat(&token::PathSep) {
let (ident, item_kind) = if self.eat_path_sep() {
let suffixes = if self.eat(&token::BinOp(token::Star)) {
None
} else {
Expand Down
44 changes: 44 additions & 0 deletions tests/ui/parser/triple-colon-delegation.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//@ run-rustfix

#![feature(fn_delegation)]
#![allow(incomplete_features, unused)]

trait Trait {
fn foo(&self) {}
}

struct F;
impl Trait for F {}

pub mod to_reuse {
pub fn bar() {}
}

mod fn_to_other {
use super::*;

reuse Trait::foo; //~ ERROR path separator must be a double colon
reuse to_reuse::bar; //~ ERROR path separator must be a double colon
}

impl Trait for u8 {}

struct S(u8);

mod to_import {
pub fn check(arg: &u8) -> &u8 { arg }
}

impl Trait for S {
reuse Trait::* { //~ ERROR path separator must be a double colon
use to_import::check;

let _arr = Some(self.0).map(|x| [x * 2; 3]);
check(&self.0)
}
}

fn main() {
let s = S(0);
s.foo();
}
44 changes: 44 additions & 0 deletions tests/ui/parser/triple-colon-delegation.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//@ run-rustfix

#![feature(fn_delegation)]
#![allow(incomplete_features, unused)]

trait Trait {
fn foo(&self) {}
}

struct F;
impl Trait for F {}

pub mod to_reuse {
pub fn bar() {}
}

mod fn_to_other {
use super::*;

reuse Trait:::foo; //~ ERROR path separator must be a double colon
reuse to_reuse:::bar; //~ ERROR path separator must be a double colon
}

impl Trait for u8 {}

struct S(u8);

mod to_import {
pub fn check(arg: &u8) -> &u8 { arg }
}

impl Trait for S {
reuse Trait:::* { //~ ERROR path separator must be a double colon
use to_import::check;

let _arr = Some(self.0).map(|x| [x * 2; 3]);
check(&self.0)
}
}

fn main() {
let s = S(0);
s.foo();
}
38 changes: 38 additions & 0 deletions tests/ui/parser/triple-colon-delegation.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
error: path separator must be a double colon
--> $DIR/triple-colon-delegation.rs:20:18
|
LL | reuse Trait:::foo;
| ^
|
help: use a double colon instead
|
LL - reuse Trait:::foo;
LL + reuse Trait::foo;
|

error: path separator must be a double colon
--> $DIR/triple-colon-delegation.rs:21:21
|
LL | reuse to_reuse:::bar;
| ^
|
help: use a double colon instead
|
LL - reuse to_reuse:::bar;
LL + reuse to_reuse::bar;
|

error: path separator must be a double colon
--> $DIR/triple-colon-delegation.rs:33:18
|
LL | reuse Trait:::* {
| ^
|
help: use a double colon instead
|
LL - reuse Trait:::* {
LL + reuse Trait::* {
|

error: aborting due to 3 previous errors

0 comments on commit 82482dc

Please sign in to comment.