Skip to content

Commit 40b8514

Browse files
author
xubo.rs
committed
Support use self::super as name;
1 parent 7fe2685 commit 40b8514

4 files changed

Lines changed: 44 additions & 32 deletions

File tree

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,21 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
643643
}
644644
}
645645
kw::Super => {
646-
if module_path.iter().any(|seg| seg.ident.name != kw::Super) {
646+
// Allow the following forms:
647+
// `use super as name;`
648+
// `use super::super as name;`
649+
// `use self::super as name;`
650+
// `use self::super::super as name;`
651+
let valid_prefix = module_path.is_empty()
652+
|| matches!(
653+
module_path.first().unwrap().ident.name,
654+
kw::SelfLower | kw::Super
655+
) && module_path
656+
.iter()
657+
.skip(1)
658+
.all(|seg| seg.ident.name == kw::Super);
659+
660+
if !valid_prefix {
647661
self.r.dcx().span_err(
648662
source.ident.span,
649663
"`super` in paths can only be used in start position or after another `super`",

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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
@@ -1185,7 +1183,7 @@ error[E0433]: failed to resolve: `self` in paths can only be used in start posit
11851183
LL | type D6 = self::self;
11861184
| ^^^^ `self` in paths can only be used in start position
11871185

1188-
error: aborting due to 131 previous errors
1186+
error: aborting due to 129 previous errors
11891187

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

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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
@@ -939,7 +937,7 @@ LL | type D7 = crate::foo::bar::self;
939937
| ^^^^ `self` in paths can only be used in start position
940938

941939
error[E0433]: failed to resolve: could not find `_nested_self2` in `bar`
942-
--> $DIR/use-path-segment-kw.rs:239:15
940+
--> $DIR/use-path-segment-kw.rs:241:15
943941
|
944942
LL | foo::bar::_nested_self2::outer();
945943
| ^^^^^^^^^^^^^ could not find `_nested_self2` in `bar`
@@ -1162,7 +1160,7 @@ error[E0433]: failed to resolve: `self` in paths can only be used in start posit
11621160
LL | type D6 = self::self;
11631161
| ^^^^ `self` in paths can only be used in start position
11641162

1165-
error: aborting due to 128 previous errors
1163+
error: aborting due to 126 previous errors
11661164

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

tests/ui/use/use-path-segment-kw.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,10 @@ mod foo {
160160
pub use super::{super as _nested_super5};
161161

162162
type C6 = self::super; //~ ERROR expected type, found module `self::super`
163-
use self::super; //~ ERROR `super` in paths can only be used in start position or after another `super`
164-
use self::super as _super6; //~ ERROR `super` in paths can only be used in start position or after another `super`
165-
use self::{super}; //~ ERROR `super` in paths can only be used in start position or after another `super`
166-
use self::{super as _nested_super6}; //~ ERROR `super` in paths can only be used in start position or after another `super`
163+
use self::super; //~ ERROR imports need to be explicitly named
164+
pub use self::super as _super6;
165+
use self::{super}; //~ ERROR imports need to be explicitly named
166+
pub use self::{super as _nested_super6};
167167

168168
// --- self ---
169169
// use self::*; // Suppress other errors
@@ -232,6 +232,8 @@ fn main() {
232232
foo::bar::_super::bar::foobar::inner();
233233
foo::bar::_super5::outer();
234234
foo::bar::_nested_super5::outer();
235+
foo::bar::_super6::bar::foobar::inner();
236+
foo::bar::_nested_super6::bar::foobar::inner();
235237

236238
foo::bar::_self::foobar::inner();
237239
foo::bar::qux::inner(); // Works after recovery

0 commit comments

Comments
 (0)