Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stabilize feature(trait_upcasting) #134367

Open
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

WaffleLapkin
Copy link
Member

@WaffleLapkin WaffleLapkin commented Dec 16, 2024

This feature was "done" for a while now, I think it's finally time to stabilize it! (stabilization report pending)
cc reference PR: rust-lang/reference#1622, tracking issue: #65991

r? compiler-errors

@WaffleLapkin WaffleLapkin added T-lang Relevant to the language team, which will review and decide on the PR/issue. F-trait_upcasting `#![feature(trait_upcasting)]` labels Dec 16, 2024
@rustbot rustbot added PG-exploit-mitigations Project group: Exploit mitigations S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Dec 16, 2024
@rustbot
Copy link
Collaborator

rustbot commented Dec 16, 2024

Some changes occurred in tests/ui/sanitizer

cc @rust-lang/project-exploit-mitigations, @rcvalle

@WaffleLapkin WaffleLapkin added T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. and removed PG-exploit-mitigations Project group: Exploit mitigations WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Dec 16, 2024
@compiler-errors
Copy link
Member

Could you please provide some links that specify what has been done since the last stabilization? Ideally both the issues and the resulting fix PRs.

Ty for doing this tho :)

Gna nominate for T-lang but this should be an easy decision.

@compiler-errors compiler-errors added I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy; this does not imply nomination and removed T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Dec 16, 2024
@compiler-errors
Copy link
Member

And maybe link to the last stabilization too

@rust-log-analyzer

This comment has been minimized.

@rustbot rustbot added PG-exploit-mitigations Project group: Exploit mitigations WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Dec 16, 2024
@rustbot
Copy link
Collaborator

rustbot commented Dec 16, 2024

The Miri subtree was changed

cc @rust-lang/miri

@WaffleLapkin WaffleLapkin added S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). and removed PG-exploit-mitigations Project group: Exploit mitigations WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Dec 16, 2024
@RalfJung RalfJung added the I-lang-nominated Nominated for discussion during a lang team meeting. label Dec 16, 2024
@WaffleLapkin
Copy link
Member Author

WaffleLapkin commented Dec 16, 2024

Stabilization report

The core of the feature hasn't changed since the last attempt to stabilize it.

But as a reminder this feature allows "upcasting" dyn Sub to dyn Super, such as in this example:

trait Sub: Super {}
trait Super {}

fn upcast(x: &dyn Sub) -> &dyn Super {
    x // implicit coercion
}

This is a long wanted feature that people used workarounds for for a long while now.

One possible downside is that this forces us into including more data in the vtables. However, our measurements show that the overhead is mostly negligible. Also note that we ate already including this overhead on stable for countless versions and no one ever complained.

Another possible downside is that this feature this allows upcasting of raw trait pointers in safe code. That puts constraints on their library invariant (safety invariant) -- specifically, even *const dyn Trait must always come with a vtable that is valid for Trait. This was also discussed during previous stabilization attempts, but still, something to keep in mind.

I believe that the feature is well tested and is ready for stabilization.

Previous stabilization attempt problems

After the last attempt to stabilize this feature @steffahn found two unsound interactions between trait upcasting and pointer casting (one of which also required feature(arbitrary_self_types)): #120222 and #120217. This caused a revert of the stabilization PR.

Both issues were since fixed in #120248 by adding additional checks for casting pointers, to uphold the library invariant of pointers to trait objects which is needed for this feature.

No new issues were found since.

@WaffleLapkin WaffleLapkin removed the I-lang-nominated Nominated for discussion during a lang team meeting. label Dec 16, 2024
@WaffleLapkin
Copy link
Member Author

(@RalfJung I'm pretty sure I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy; this does not imply nomination implies nomination and you don't need I-lang-nominated Nominated for discussion during a lang team meeting. )

@RalfJung
Copy link
Member

RalfJung commented Dec 16, 2024

@traviscross told me the opposite -- it still needs to be nominated with the regular label.

The label description should probably clarify or else people will inevitably keep getting this wrong.

@RalfJung
Copy link
Member

RalfJung commented Dec 16, 2024

The only possible downside

That's a very strong statement.^^

I'd say there is at least one other downside, or point worth mentioning: this allows upcasting of raw trait pointers in safe code. That puts constraints on their library invariant (safety invariant) -- specifically, even *const dyn Trait must always come with a vtable that is valid for Trait.

I'm fine with that, and AFAIK @rust-lang/types agrees, but it is a choice we are making here that should be called out explicitly. @rust-lang/opsem is still discussing what to do with the language invariant for raw trait pointers; having that be different from the library invariant is likely surprising but OTOH we still might want a weaker invariant here.

@WaffleLapkin WaffleLapkin added the I-lang-nominated Nominated for discussion during a lang team meeting. label Dec 16, 2024
@WaffleLapkin
Copy link
Member Author

@RalfJung I did call this out, but maybe not explicitly enough ("the only" slipped from an earlier draft). I've updated the wording to more clearly highlight this.

@rfcbot rfcbot added the to-announce Announce this issue on triage meeting label Dec 28, 2024
@rfcbot
Copy link

rfcbot commented Dec 28, 2024

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@WaffleLapkin
Copy link
Member Author

Current status (so I don't forget): this is waiting on chalk/r-a properly handling upcasting and on T-lang to make a decision about the lint.

@WaffleLapkin WaffleLapkin added S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). and removed S-waiting-on-fcp Status: PR is in FCP and is awaiting for FCP to complete. labels Jan 3, 2025
@bors
Copy link
Contributor

bors commented Jan 8, 2025

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

@theemathas
Copy link
Contributor

theemathas commented Jan 10, 2025

Trait upcasting has a soundness/miscompilation bug. Oops. #135315

@steffahn
Copy link
Member

I kind-of hate to once again be the one finding new issues at the last minute that could be further delaying this feature, sowwy 🫠

but soundness is soundness! 😇

@nikomatsakis
Copy link
Contributor

nikomatsakis commented Jan 10, 2025 via email

@WaffleLapkin
Copy link
Member Author

image

But on a more serious note, thanks for finding the bugs (so we can fix them!). And also, it's nice to know about them before merging stabilization, so we don't have to revert anything. <3 @steffahn

@WaffleLapkin
Copy link
Member Author

Status update: I've implemented the feature in chalk/r-a.

This is now waiting on t-lang decision about the lint and some soundness fixes to the issues @steffahn found.

@WaffleLapkin WaffleLapkin force-pushed the trait_upcasting_as_a_treat branch from 8563da8 to 7784445 Compare January 16, 2025 14:40
@rustbot rustbot added A-rustc-dev-guide Area: rustc-dev-guide PG-exploit-mitigations Project group: Exploit mitigations WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Jan 16, 2025
@rustbot

This comment was marked as outdated.

We can't remove `TraitUpcasting` variant, since we need to use the index
in winnowing.
@WaffleLapkin WaffleLapkin force-pushed the trait_upcasting_as_a_treat branch from 5bbd482 to 1d898c7 Compare January 16, 2025 15:09
@WaffleLapkin
Copy link
Member Author

(sorry for the ping, I accidentally deleted the whole rustc dev guide; I reverted this, so yeah...)

@WaffleLapkin WaffleLapkin removed PG-exploit-mitigations Project group: Exploit mitigations WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) A-rustc-dev-guide Area: rustc-dev-guide labels Jan 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. F-trait_upcasting `#![feature(trait_upcasting)]` finished-final-comment-period The final comment period is finished for this PR / Issue. I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy; this does not imply nomination I-lang-nominated Nominated for discussion during a lang team meeting. relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). T-lang Relevant to the language team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting
Projects
None yet
Development

Successfully merging this pull request may close these issues.