Skip to content

Commit 1a6ec7e

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

File tree

2 files changed

+1293
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)