Skip to content

Commit d51445c

Browse files
committed
Add test for importing path-segment keyword
1 parent 11d2046 commit d51445c

File tree

2 files changed

+1282
-0
lines changed

2 files changed

+1282
-0
lines changed
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
//@ edition: 2021
2+
3+
macro_rules! macro_dollar_crate {
4+
() => {
5+
use $crate; //~ ERROR `$crate` may not be imported
6+
pub use $crate as _dollar_crate; //~ ERROR `$crate` may not be imported
7+
8+
use ::$crate; //~ ERROR unresolved import `$crate`
9+
use ::$crate as _dollar_crate2; //~ ERROR unresolved import `$crate`
10+
use ::{$crate}; //~ ERROR unresolved import `$crate`
11+
use ::{$crate as _nested_dollar_crate2}; //~ ERROR unresolved import `$crate`
12+
13+
type T1 = foobar::$crate::Foo; //~ ERROR failed to resolve: `$crate` in paths can only be used in start position
14+
15+
use foobar::$crate; //~ ERROR unresolved import `foobar::$crate`
16+
use foobar::$crate as _dollar_crate3; //~ ERROR unresolved import `foobar::$crate`
17+
use foobar::{$crate}; //~ ERROR unresolved import `foobar::$crate`
18+
use foobar::{$crate as _nested_dollar_crate3}; //~ ERROR unresolved import `foobar::$crate`
19+
20+
use crate::$crate; //~ ERROR unresolved import `crate::$crate`
21+
use crate::$crate as _dollar_crate4; //~ ERROR unresolved import `crate::$crate`
22+
use crate::{$crate}; //~ ERROR unresolved import `crate::$crate`
23+
use crate::{$crate as _nested_dollar_crate4}; //~ ERROR unresolved import `crate::$crate`
24+
25+
use super::$crate; //~ ERROR unresolved import `super::$crate`
26+
use super::$crate as _dollar_crate5; //~ ERROR unresolved import `super::$crate`
27+
use super::{$crate}; //~ ERROR unresolved import `super::$crate`
28+
use super::{$crate as _nested_dollar_crate5}; //~ ERROR unresolved import `super::$crate`
29+
30+
use self::$crate;
31+
use self::$crate as _dollar_crate6;
32+
use self::{$crate};
33+
use self::{$crate as _nested_dollar_crate6};
34+
35+
use $crate::$crate; //~ ERROR unresolved import `$crate::$crate`
36+
use $crate::$crate as _dollar_crate7; //~ ERROR unresolved import `$crate::$crate`
37+
use $crate::{$crate}; //~ ERROR unresolved import `$crate::$crate`
38+
use $crate::{$crate as _nested_dollar_crate7}; //~ ERROR unresolved import `$crate::$crate`
39+
40+
use $crate::*;
41+
use $crate::{};
42+
43+
use $crate::crate; //~ ERROR unresolved import `$crate::crate`
44+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
45+
use $crate::crate as _m_crate8; //~ ERROR unresolved import `$crate::crate`
46+
use $crate::{crate}; //~ ERROR unresolved import `$crate::crate`
47+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
48+
use $crate::{crate as _m_nested_crate8}; //~ ERROR unresolved import `$crate::crate`
49+
50+
use $crate::super; //~ ERROR unresolved import `$crate::super`
51+
use $crate::super as _m_super8; //~ ERROR unresolved import `$crate::super`
52+
use $crate::{super}; //~ ERROR unresolved import `$crate::super`
53+
use $crate::{super as _m_nested_super8}; //~ ERROR unresolved import `$crate::super`
54+
55+
use $crate::self; //~ ERROR `$crate` may not be imported
56+
//~^ ERROR `self` imports are only allowed within a { } list
57+
//~^^ ERROR the name `<!dummy!>` is defined multiple times
58+
pub use $crate::self as _m_self8; //~ ERROR `self` imports are only allowed within a { } list
59+
//~^ ERROR `$crate` may not be imported
60+
use $crate::{self};
61+
//~^ ERROR the name `$crate` is defined multiple times
62+
pub use $crate::{self as _m_nested_self8}; // Good
63+
}
64+
}
65+
66+
struct Foo;
67+
68+
fn outer() {}
69+
70+
mod foo {
71+
pub mod bar {
72+
struct Foo;
73+
74+
pub mod foobar {
75+
pub mod qux {
76+
pub use super::inner;
77+
}
78+
79+
pub mod baz {
80+
pub use super::inner;
81+
}
82+
83+
pub fn inner() {}
84+
}
85+
86+
// --- $crate ---
87+
macro_dollar_crate!();
88+
89+
// --- crate ---
90+
use crate;
91+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
92+
pub use crate as _crate; // Good
93+
94+
use ::crate;
95+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
96+
//~^^ ERROR unresolved import `crate`
97+
use ::crate as _crate2;
98+
//~^ ERROR unresolved import `crate`
99+
use ::{crate};
100+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
101+
//~^^ ERROR unresolved import `crate`
102+
use ::{crate as _nested_crate2};
103+
//~^ ERROR unresolved import `crate`
104+
105+
type T2 = foobar::crate::Foo; //~ ERROR failed to resolve: `crate` in paths can only be used in start position
106+
107+
use foobar::crate; //~ ERROR unresolved import `foobar::crate`
108+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
109+
use foobar::crate as _crate3; //~ ERROR unresolved import `foobar::crate`
110+
use foobar::{crate}; //~ ERROR unresolved import `foobar::crate`
111+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
112+
use foobar::{crate as _nested_crate3}; //~ ERROR unresolved import `foobar::crate`
113+
114+
use crate::crate; //~ ERROR unresolved import `crate::crate`
115+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
116+
use crate::crate as _crate4; //~ ERROR unresolved import `crate::crate`
117+
use crate::{crate}; //~ ERROR unresolved import `crate::crate`
118+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
119+
use crate::{crate as _nested_crate4}; //~ ERROR unresolved import `crate::crate`
120+
121+
use super::crate; //~ ERROR unresolved import `super::crate`
122+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
123+
use super::crate as _crate5; //~ ERROR unresolved import `super::crate`
124+
use super::{crate}; //~ ERROR unresolved import `super::crate`
125+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
126+
use super::{crate as _nested_crate5}; //~ ERROR unresolved import `super::crate`
127+
128+
use self::crate;
129+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
130+
//~^^ ERROR the name `crate` is defined multiple times
131+
use self::crate as _crate6;
132+
use self::{crate};
133+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
134+
//~^^ ERROR the name `crate` is defined multiple times
135+
use self::{crate as _nested_crate6};
136+
137+
use crate::*; // Good
138+
use crate::{}; // Good
139+
140+
// --- super ---
141+
use super; //~ ERROR unresolved import `super`
142+
pub use super as _super; //~ ERROR unresolved import `super`
143+
144+
use ::super; //~ ERROR unresolved import `super`
145+
use ::super as _super2; //~ ERROR unresolved import `super`
146+
use ::{super}; //~ ERROR unresolved import `super`
147+
use ::{super as _nested_super2}; //~ ERROR unresolved import `super`
148+
149+
type T3 = foobar::super::Foo; //~ ERROR failed to resolve: `super` in paths can only be used in start position
150+
151+
use foobar::super; //~ ERROR unresolved import `foobar::super`
152+
use foobar::super as _super3; //~ ERROR unresolved import `foobar::super`
153+
use foobar::{super}; //~ ERROR unresolved import `foobar::super`
154+
use foobar::{super as _nested_super3}; //~ ERROR unresolved import `foobar::super`
155+
156+
use crate::super; //~ ERROR unresolved import `crate::super`
157+
use crate::super as _super4; //~ ERROR unresolved import `crate::super`
158+
use crate::{super}; //~ ERROR unresolved import `crate::super`
159+
use crate::{super as _nested_super4}; //~ ERROR unresolved import `crate::super`
160+
161+
use super::super; //~ ERROR unresolved import `super::super`
162+
pub use super::super as _super5; //~ ERROR unresolved import `super::super`
163+
use super::{super}; //~ ERROR unresolved import `super::super`
164+
pub use super::{super as _nested_super5}; //~ ERROR unresolved import `super::super`
165+
166+
use self::super;
167+
use self::super as _super6;
168+
use self::{super};
169+
use self::{super as _nested_super6};
170+
171+
// --- self ---
172+
use self; //~ ERROR `self` imports are only allowed within a { } list
173+
pub use self as _self; //~ ERROR `self` imports are only allowed within a { } list
174+
175+
use ::self; //~ ERROR `self` imports are only allowed within a { } list
176+
//~^ ERROR unresolved import `{{root}}`
177+
use ::self as _self2; //~ ERROR `self` imports are only allowed within a { } list
178+
//~^ ERROR unresolved import `{{root}}`
179+
use ::{self}; //~ ERROR `self` import can only appear in an import list with a non-empty prefix
180+
use ::{self as _nested_self2}; //~ ERROR `self` import can only appear in an import list with a non-empty prefix
181+
182+
type T4 = foobar::self::Foo; //~ ERROR failed to resolve: `self` in paths can only be used in start position
183+
184+
pub use foobar::qux::self; //~ ERROR `self` imports are only allowed within a { } list
185+
pub use foobar::self as _self3; //~ ERROR `self` imports are only allowed within a { } list
186+
pub use foobar::baz::{self}; // Good
187+
pub use foobar::{self as _nested_self3}; // Good
188+
189+
use crate::self;
190+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
191+
//~^^ ERROR `self` imports are only allowed within a { } list
192+
//~^^^ ERROR the name `crate` is defined multiple times
193+
pub use crate::self as _self4; //~ ERROR `self` imports are only allowed within a { } list
194+
use crate::{self};
195+
//~^ ERROR crate root imports need to be explicitly named: `use crate as name;`
196+
//~^^ ERROR the name `crate` is defined multiple times
197+
pub use crate::{self as _nested_self4}; // Good
198+
199+
use super::self; //~ ERROR unresolved import `super`
200+
//~^ ERROR `self` imports are only allowed within a { } list
201+
pub use super::self as _self5; //~ ERROR `self` imports are only allowed within a { } list
202+
//~^ ERROR unresolved import `super`
203+
use super::{self}; //~ ERROR unresolved import `super`
204+
pub use super::{self as _nested_self5}; //~ ERROR unresolved import `super`
205+
206+
use self::self;
207+
//~^ ERROR `self` imports are only allowed within a { } list
208+
pub use self::self as _self6; //~ ERROR `self` imports are only allowed within a { } list
209+
use self::{self}; //~ ERROR unresolved import `self`
210+
pub use self::{self as _nested_self6}; //~ ERROR unresolved import `self`
211+
}
212+
}
213+
214+
fn main() {
215+
foo::bar::_dollar_crate::outer();
216+
foo::bar::_m_self8::outer();
217+
foo::bar::_dollar_crate::foo::bar::foobar::inner();
218+
foo::bar::_m_self8::foo::bar::foobar::inner();
219+
220+
foo::bar::_crate::outer();
221+
foo::bar::_crate::foo::bar::foobar::inner();
222+
223+
foo::bar::_super::bar::foobar::inner();
224+
foo::bar::_super5::outer();
225+
foo::bar::_nested_super5::outer();
226+
227+
foo::bar::_self::foobar::inner();
228+
foo::bar::qux::inner(); // Works after recovery
229+
foo::bar::baz::inner();
230+
foo::bar::_self3::inner(); // Works after recovery
231+
foo::bar::_nested_self3::inner();
232+
foo::bar::_self4::outer(); // Works after recovery
233+
foo::bar::_nested_self4::outer();
234+
foo::bar::_self5::bar::foobar::inner(); // Works after recovery
235+
foo::bar::_nested_self5::bar::foobar::inner();
236+
foo::bar::_self6::foobar::inner(); // Works after recovery
237+
foo::bar::_nested_self6::foobar::inner();
238+
}

0 commit comments

Comments
 (0)