blob: b36f2cf9bdfbac12a4e25b5da47fa88f08beb8a4 [file] [log] [blame]
#![feature(impl_restriction)]
#![expect(incomplete_features)]
pub mod a {
pub enum E {}
pub mod d {}
pub mod b {
pub mod c {}
// We do not use crate-relative paths here, since we follow the
// "uniform paths" approach used for type/expression paths.
pub impl(in a::b) trait T1 {} //~ ERROR cannot find module or crate `a` in this scope [E0433]
pub impl(in ::std) trait T2 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in self::c) trait T3 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in super::d) trait T4 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in crate::c) trait T5 {} //~ ERROR cannot find module `c` in the crate root [E0433]
pub impl(in super::E) trait T6 {} //~ ERROR expected module, found enum `super::E` [E0577]
pub impl(in super::super::super) trait T7 {} //~ ERROR too many leading `super` keywords [E0433]
// OK paths
pub impl(crate) trait T8 {}
pub impl(self) trait T9 {}
pub impl(super) trait T10 {}
pub impl(in crate::a) trait T11 {}
pub impl(in super::super) trait T12 {}
// Check if we can resolve paths referring to modules declared later.
pub impl(in self::f) trait L1 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in super::G) trait L2 {} //~ ERROR expected module, found enum `super::G` [E0577]
pub impl(in super::h) trait L3 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub mod f {}
}
pub enum G {}
pub mod h {}
}
pub impl(in crate::a) trait T13 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in crate::a::E) trait T14 {} //~ ERROR expected module, found enum `crate::a::E` [E0577]
pub impl(crate) trait T15 {}
pub impl(self) trait T16 {}
pub impl(super) trait T17 {} //~ ERROR too many leading `super` keywords [E0433]
// Check if we can resolve paths referring to modules declared later.
pub impl(in crate::j) trait L4 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in crate::I) trait L5 {} //~ ERROR expected module, found enum `crate::I` [E0577]
pub enum I {}
pub mod j {}
// Check if we can resolve `use`d paths.
mod m1 {
pub impl(in crate::m2) trait U1 {} // OK
}
use m1 as m2;
mod m3 {
mod m4 {
pub impl(in crate::m2) trait U2 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in m6) trait U3 {} // OK
pub impl(in m6::m5) trait U4 {} //~ ERROR trait implementation can only be restricted to ancestor modules
pub impl(in m7) trait U5 {} //~ ERROR expected module, found enum `m7` [E0577]
use crate::m3 as m6;
use crate::m3::E as m7;
}
mod m5 {}
pub enum E {}
}
fn main() {}