Skip to content

Commit 6609e4b

Browse files
committed
Support use self::super as name;
1 parent a348051 commit 6609e4b

4 files changed

Lines changed: 122 additions & 117 deletions

File tree

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,10 +649,17 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
649649
}
650650
}
651651
kw::Super => {
652-
if module_path.iter().any(|seg| seg.ident.name != kw::Super) {
652+
// Allow `self::super` as a valid prefix - `self` at position 0
653+
// followed by any number of `super` segments.
654+
let valid_prefix = module_path.iter().enumerate().all(|(i, seg)| {
655+
let name = seg.ident.name;
656+
name == kw::Super || (name == kw::SelfLower && i == 0)
657+
});
658+
659+
if !valid_prefix {
653660
self.r.dcx().span_err(
654661
source.ident.span,
655-
"`super` in paths can only be used in start position or after another `super`",
662+
"`super` in paths can only be used in start position, after `self`, or after another `super`",
656663
);
657664
return;
658665
}

tests/ui/use/use-path-segment-kw.e2015.stderr

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -140,77 +140,77 @@ help: try renaming it with a name
140140
LL | use super as name;
141141
| +++++++
142142

143-
error: `super` in paths can only be used in start position or after another `super`
143+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
144144
--> $DIR/use-path-segment-kw.rs:139:15
145145
|
146146
LL | use ::super;
147147
| ^^^^^
148148

149-
error: `super` in paths can only be used in start position or after another `super`
149+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
150150
--> $DIR/use-path-segment-kw.rs:140:15
151151
|
152152
LL | use ::super as _super2;
153153
| ^^^^^
154154

155-
error: `super` in paths can only be used in start position or after another `super`
155+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
156156
--> $DIR/use-path-segment-kw.rs:141:16
157157
|
158158
LL | use ::{super};
159159
| ^^^^^
160160

161-
error: `super` in paths can only be used in start position or after another `super`
161+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
162162
--> $DIR/use-path-segment-kw.rs:142:16
163163
|
164-
LL | use ::{super as _nested_super2};
165-
| ^^^^^
164+
LL | ... use ::{super as _nested_super2};
165+
| ^^^^^
166166

167-
error: `super` in paths can only be used in start position or after another `super`
167+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
168168
--> $DIR/use-path-segment-kw.rs:145:21
169169
|
170170
LL | use foobar::super;
171171
| ^^^^^
172172

173-
error: `super` in paths can only be used in start position or after another `super`
173+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
174174
--> $DIR/use-path-segment-kw.rs:146:21
175175
|
176-
LL | use foobar::super as _super3;
177-
| ^^^^^
176+
LL | ... use foobar::super as _super3;
177+
| ^^^^^
178178

179-
error: `super` in paths can only be used in start position or after another `super`
179+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
180180
--> $DIR/use-path-segment-kw.rs:147:22
181181
|
182182
LL | use foobar::{super};
183183
| ^^^^^
184184

185-
error: `super` in paths can only be used in start position or after another `super`
185+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
186186
--> $DIR/use-path-segment-kw.rs:148:22
187187
|
188-
LL | use foobar::{super as _nested_super3};
189-
| ^^^^^
188+
LL | ... use foobar::{super as _nested_super3};
189+
| ^^^^^
190190

191-
error: `super` in paths can only be used in start position or after another `super`
191+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
192192
--> $DIR/use-path-segment-kw.rs:151:20
193193
|
194194
LL | use crate::super;
195195
| ^^^^^
196196

197-
error: `super` in paths can only be used in start position or after another `super`
197+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
198198
--> $DIR/use-path-segment-kw.rs:152:20
199199
|
200-
LL | use crate::super as _super4;
201-
| ^^^^^
200+
LL | ... use crate::super as _super4;
201+
| ^^^^^
202202

203-
error: `super` in paths can only be used in start position or after another `super`
203+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
204204
--> $DIR/use-path-segment-kw.rs:153:21
205205
|
206206
LL | use crate::{super};
207207
| ^^^^^
208208

209-
error: `super` in paths can only be used in start position or after another `super`
209+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
210210
--> $DIR/use-path-segment-kw.rs:154:21
211211
|
212-
LL | use crate::{super as _nested_super4};
213-
| ^^^^^
212+
LL | ... use crate::{super as _nested_super4};
213+
| ^^^^^
214214

215215
error: imports need to be explicitly named
216216
--> $DIR/use-path-segment-kw.rs:157:20
@@ -234,29 +234,27 @@ help: try renaming it with a name
234234
LL | use super::{super as name};
235235
| +++++++
236236

237-
error: `super` in paths can only be used in start position or after another `super`
237+
error: imports need to be explicitly named
238238
--> $DIR/use-path-segment-kw.rs:163:19
239239
|
240240
LL | use self::super;
241241
| ^^^^^
242-
243-
error: `super` in paths can only be used in start position or after another `super`
244-
--> $DIR/use-path-segment-kw.rs:164:19
245242
|
246-
LL | use self::super as _super6;
247-
| ^^^^^
243+
help: try renaming it with a name
244+
|
245+
LL | use self::super as name;
246+
| +++++++
248247

249-
error: `super` in paths can only be used in start position or after another `super`
248+
error: imports need to be explicitly named
250249
--> $DIR/use-path-segment-kw.rs:165:20
251250
|
252251
LL | use self::{super};
253252
| ^^^^^
254-
255-
error: `super` in paths can only be used in start position or after another `super`
256-
--> $DIR/use-path-segment-kw.rs:166:20
257253
|
258-
LL | use self::{super as _nested_super6};
259-
| ^^^^^
254+
help: try renaming it with a name
255+
|
256+
LL | use self::{super as name};
257+
| +++++++
260258

261259
error: imports need to be explicitly named
262260
--> $DIR/use-path-segment-kw.rs:173:13
@@ -827,7 +825,7 @@ LL | macro_dollar_crate!();
827825
|
828826
= note: this error originates in the macro `macro_dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
829827

830-
error: `super` in paths can only be used in start position or after another `super`
828+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
831829
--> $DIR/use-path-segment-kw.rs:57:21
832830
|
833831
LL | use $crate::super;
@@ -838,18 +836,18 @@ LL | macro_dollar_crate!();
838836
|
839837
= note: this error originates in the macro `macro_dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
840838

841-
error: `super` in paths can only be used in start position or after another `super`
839+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
842840
--> $DIR/use-path-segment-kw.rs:58:21
843841
|
844-
LL | use $crate::super as _m_super8;
845-
| ^^^^^
842+
LL | ... use $crate::super as _m_super8;
843+
| ^^^^^
846844
...
847-
LL | macro_dollar_crate!();
848-
| --------------------- in this macro invocation
845+
LL | ... macro_dollar_crate!();
846+
| --------------------- in this macro invocation
849847
|
850848
= note: this error originates in the macro `macro_dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
851849

852-
error: `super` in paths can only be used in start position or after another `super`
850+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
853851
--> $DIR/use-path-segment-kw.rs:59:22
854852
|
855853
LL | use $crate::{super};
@@ -860,14 +858,14 @@ LL | macro_dollar_crate!();
860858
|
861859
= note: this error originates in the macro `macro_dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
862860

863-
error: `super` in paths can only be used in start position or after another `super`
861+
error: `super` in paths can only be used in start position, after `self`, or after another `super`
864862
--> $DIR/use-path-segment-kw.rs:60:22
865863
|
866-
LL | use $crate::{super as _m_nested_super8};
867-
| ^^^^^
864+
LL | ... use $crate::{super as _m_nested_super8};
865+
| ^^^^^
868866
...
869-
LL | macro_dollar_crate!();
870-
| --------------------- in this macro invocation
867+
LL | ... macro_dollar_crate!();
868+
| --------------------- in this macro invocation
871869
|
872870
= note: this error originates in the macro `macro_dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
873871

@@ -1195,7 +1193,7 @@ error[E0433]: `self` in paths can only be used in start position
11951193
LL | type D6 = self::self;
11961194
| ^^^^ can only be used in path start position
11971195

1198-
error: aborting due to 131 previous errors
1196+
error: aborting due to 129 previous errors
11991197

12001198
Some errors have detailed explanations: E0429, E0432, E0433, E0573.
12011199
For more information about an error, try `rustc --explain E0429`.

0 commit comments

Comments
 (0)