Skip to content

Implement #[derive(From)] - #144922

Merged
bors merged 4 commits into
rust-lang:masterfrom
Kobzol:derive-from
Aug 16, 2025
Merged

bors merged 4 commits into
rust-lang:masterfrom
Kobzol:derive-from

Conversation

@Kobzol

@Kobzol Kobzol commented Aug 4, 2025 •

Copy link
Copy Markdown
Member

Implements the #[derive(From)] feature (tracking issue, RFC).

It allows deriving the From impl on structs and tuple structs with exactly one field. Some implementation notes:

  • I wasn't exactly sure which spans to use in the derive generating code, so I just used span everywhere. I don't know if it's the Right Thing To Do. In particular the errors when #[derive(From)] is used on a struct with an unsized field are weirdly duplicated.
  • I had to solve an import stability problem, where if I just added the unstable macro From to core::convert, previously working code like use std::convert::From would suddenly require an unstable feature gate, because rustc would think that you're trying to import the unstable macro. @petrochenkov suggested that I add the macro the the core prelude instead. This has worked well, although it only works in edition 2021+. Not sure if I botched the prelude somehow and it should live elsewhere (?).
  • I had to add Ty::AstTy, because the from function receives an argument with the type of the single field, and the existing variants of the Ty enum couldn't represent an arbitrary type.

@rustbot

rustbot commented Aug 4, 2025

Copy link
Copy Markdown
Collaborator

r? @SparrowLii

rustbot has assigned @SparrowLii.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Aug 4, 2025
@Kobzol Kobzol added the F-derive_from Feature gate for #[derive(From)] built-in derive macro (RFC 3809). label Aug 4, 2025
@bors

ghost commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #145146) made this pull request unmergeable. Please resolve the merge conflicts.

ghost left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

On the right track, but a few things need fixing.

There is a test called tests/ui/deriving/deriving-all-codegen.rs which tests the output of all builtin derives. It's really useful to have a test that shows the actual output, so that minor changes can be seen.

From should be added to that file. A lot of the structs don't have a single field, it would be worth adding/moving some of the ones from deriving-from.rs to it.

The derive(...) lists are in mostly-alphabetical order, so I would put From in between Default and Hash.

@rustbot author

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 15, 2025
@Kobzol

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Member Author

I tried to resolve review remarks, and improve the error message(s). Before fixing tests, I'd like to know your opinion on the current errors.

@rustbot

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Collaborator

Changes to the code generated for builtin derived traits.

cc @nnethercote

@rust-log-analyzer

This comment has been minimized.

@nnethercote

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Contributor

Good progress. The new error messages look good, thanks.

@nnethercote

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Contributor

Ok: squash the final 7 commits together, undo the formatting changes to deriving-all-codegen.rs, and r=me.

@Kobzol

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Member Author

@bors r=nnethercote

@bors

ghost commented Aug 15, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit 1f3a747 has been approved by nnethercote

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Aug 15, 2025
@bors
bors merged commit 2b1a288 into rust-lang:master Aug 16, 2025
@rustbot rustbot added this to the 1.91.0 milestone Aug 16, 2025
@jhpratt

ghost commented Aug 16, 2025

Copy link
Copy Markdown
Member

still in queue; merged in #145475

@bors r-

@bors bors added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Aug 16, 2025
@Kobzol
Kobzol deleted the derive-from branch August 16, 2025 05:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

F-derive_from Feature gate for #[derive(From)] built-in derive macro (RFC 3809). S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants