Parser: recover from ::: to :: in delegations

This commit is contained in:
Pavel Grigorenko 2024-09-21 20:29:22 +03:00
parent e90e2593ea
commit 82482dc357
4 changed files with 127 additions and 1 deletions

View File

@ -707,7 +707,7 @@ fn parse_item_delegation(&mut self) -> PResult<'a, ItemInfo> {
})
};
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 {

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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