Clone "copyables" using copy codegen #588
Labels
major-change
A proposal to make a major change to rustc
major-change-accepted
A major change proposal that was accepted
T-compiler
Add this label so rfcbot knows to poll the compiler team
Proposal
It has been a long-standing issue that not having
impl Copy
/#[derive(Copy)]
on a type that could have it results in worseClone
codegen (rust-lang/rust#47796, rust-lang/rust#69174). A particularly extreme example of this can be found at https://godbolt.org/z/sKEbd6zPx.This MCP proposes to move the
Clone
derivation to be done at MIR, so that it is possible to take advantage of more type knowledge and know if a type could implement copy, or for short, it is "copyable"*. I have created a rough draft that does this move without the introduction of this "copyable" optimization at rust-lang/rust@master...octylFractal:rust:feature/derive-clone-in-mir, so it is possible to at least move the derivation. The next step would be to refine this change, and introduce a "copyable" query to allow this new derivation code to emit*self
for "copyable" types, and for the MIR -> IR lowering to accept*self
for types that are "copyable" and generate the same code as implementingCopy
would allow.* A more formal definition of "copyable": a type
T
is "copyable" ifT: Copy
or if it is an ADT and all of its field are "copyable"Mentors or Reviewers
@Aaron1011's comment here inspired some of the work, so they might be interested.
Process
The main points of the Major Change Process are as follows:
@rustbot second
.-C flag
, then full team check-off is required.@rfcbot fcp merge
on either the MCP or the PR.You can read more about Major Change Proposals on forge.
Comments
This issue is not meant to be used for technical discussion. There is a Zulip stream for that. Use this issue to leave procedural comments, such as volunteering to review, indicating that you second the proposal (or third, etc), or raising a concern that you would like to be addressed.
The text was updated successfully, but these errors were encountered: