Skip to content

Clarify that {self} imports require a module parent#2221

Open
traviscross wants to merge 2 commits intomasterfrom
TC/use-self-module-restriction
Open

Clarify that {self} imports require a module parent#2221
traviscross wants to merge 2 commits intomasterfrom
TC/use-self-module-restriction

Conversation

@traviscross
Copy link
Copy Markdown
Contributor

The self keyword in a use brace (e.g., use m::{self}) creates a binding for the parent entity. The note in items.use.self.intro says that self "means the current module of the parent segment", but there's no rule restricting what the parent can be.

The parent path must resolve to a module, enumeration, or trait -- i.e., entities that act as modules for name resolution. Using self with other entities such as structs or unions is rejected by the compiler (as of rust-lang/rust#152996).

Let's add a rule to make this restriction explicit.

See:

cc @ehuss @mu001999 @petrochenkov

The `self` keyword in a use brace (e.g., `use m::{self}`) creates a
binding for the parent entity.  The note in `items.use.self.intro`
says that `self` "means the current module of the parent segment", but
there's no rule restricting what the parent can be.

The parent path must resolve to a module, enumeration, or trait --
i.e., entities that act as modules for name resolution.  Using `self`
with other entities such as structs or unions is rejected by the
compiler (as of rust-lang/rust#152996).

Let's add a rule to make this restriction explicit.
In the prior commit, we added a link reference definition for "brace
syntax". Let's update the other use in the chapter to use that.
@traviscross traviscross added the S-waiting-on-stabilization Waiting for a stabilization PR to be merged in the main Rust repository label Apr 4, 2026
@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Apr 4, 2026
Copy link
Copy Markdown
Contributor

@ehuss ehuss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@traviscross traviscross removed the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Apr 7, 2026
rust-bors bot pushed a commit to rust-lang/rust that referenced this pull request Apr 10, 2026
…etrochenkov

Replacing `self` overwriting with proper resolution

Reference PR:

- rust-lang/reference#2221



As a follow-up PR to #146972 ([step 1](#152996 (comment))), after this PR:
~~1. Trailing `self` can appear in paths (as the consensus in #146972 (comment) (in future)
~~2. [E0429](https://doc.rust-lang.org/stable/error_codes/E0429.html#error-code-e0429) will be no longer emitted, `use ...::self [as target];` will be equivalent to `use ...::{self [as target]};`~~ (in future)
3. Things like `struct S {}; use S::{self as Other};` will be rejected

---

This PR used to add a new lint `redundant_self`, which would lint `use ...::self [as target];` and `use ...::{self [as target]};`, and fixes all warnings emitted by this lint.

But this lint and clippy lint [unnecessary_self_imports](https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_self_imports) have some overlap. And `use std::io::self;` is not equivalent to `use std::io` in fact for now, the new lint will also cause the following known issue:
> Removing `::{self}` will cause any non-module items at the same path to also be imported. This might cause a naming conflict (rust-lang/rustfmt#3568).

So I removed this lint, and I think what it does should be done by extending the clippy lint `unnecessary_self_imports`.

r? petrochenkov
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-stabilization Waiting for a stabilization PR to be merged in the main Rust repository

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants