Skip to content

Move trait prototype - #161457

Draft
zannabianca1997 wants to merge 17 commits into
rust-lang:mainfrom
zannabianca1997:move-trait
Draft

Move trait prototype#161457
zannabianca1997 wants to merge 17 commits into
rust-lang:mainfrom
zannabianca1997:move-trait

Conversation

@zannabianca1997

@zannabianca1997 zannabianca1997 commented Aug 21, 2026

Copy link
Copy Markdown

Finishing the work started by @nia-e in #156018 :

Add a barebones implementation for Move (#149607), pending some diagnostics changes & tests.

TODO

  • next solver currently errors when not enabling feature(move_trait)
  • change printing of trait objects to not show Move
  • change printing of opaque types to not show Move
  • fix mangling of Move bounds
  • how to handle empty trait object that now are dyn Move
  • also make sure rustdoc handles move correctly
  • valuable to look into why diesel regresses

r? lcnr

@rustbot rustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Aug 21, 2026
@rustbot

rustbot commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the pull request, and welcome! The Rust Project has assigned @lcnr (or someone else) to review your changes, you should hear from them (or someone else) within the next two weeks.

Please see the contribution instructions for more information.

@rust-log-analyzer

This comment has been minimized.

@lcnr lcnr mentioned this pull request Aug 21, 2026
3 tasks
@lcnr lcnr changed the title Move trait prototype Move trait prototype Aug 21, 2026
@zannabianca1997

Copy link
Copy Markdown
Author

A quick ./x.py test tests/ui locally to have a baseline

test result: FAILED. 9 passed; 206 failed; 21862 ignored; 0 measured; 0 filtered out; finished in 1.14s

@zannabianca1997

Copy link
Copy Markdown
Author
test result: FAILED. 21801 passed; 32 failed; 244 ignored; 0 measured; 0 filtered out; finished in 168.70s

wow that were a lot of them. looks like the next batch is a bunch of fn that now has fn() + Move

@rust-log-analyzer

This comment has been minimized.

@zannabianca1997

Copy link
Copy Markdown
Author

looking at the errors, there is also a bunch of (dyn + 'static) printing.

Those are all checks going around the trait_alias feature, that created before empty trait object and now creates what are effectively dyn Move, that are being misprinted.

That sure raises a question - can we handle them now? ummm - putting this aside in favour of lower hanging fruits

@zannabianca1997

Copy link
Copy Markdown
Author

@lcnr this last one (520bc2f)

it's better to break the ABI and accept all aymbol mangling containing Move or we have to decide a way to mangle ?Move? I know rust has no stable abi but to put it in all symbols seems a bit too much

@rust-log-analyzer

This comment has been minimized.

@rust-bors

This comment has been minimized.

nia-e and others added 10 commits August 23, 2026 20:56
it should give some info tho...
Oh wow that got done with A LOT of tests
This is one of the two options, the other being break ABI. I suspect we
can do it, Rust not having a stable one (?)
mostly to avoid adding to every single dynamic symbol the `+ Move`
the output uses the debug print and parses it with regex

fixed the regex to fetch the first trait, instead of Move
@rust-log-analyzer

This comment has been minimized.

I am _almost_ sure this is what nia wanted to write. I am modifying the
behaviour, but I don't see how should it be different, as Move enters
now the implicit trait group
@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.


// We don't support empty trait objects.
if regular_traits.is_empty() && auto_traits.is_empty() {
if regular_traits.iter().all(|t| tcx.is_implicit_trait(t.0.skip_binder().def_id(), false))

@lcnr lcnr Aug 28, 2026

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.

hmm, feel like this can just be regular_traits.chain(auto_traits).all(is_implicit_trait)

also existing, but can you replace the bool of is_implicit_trait wth an enum, e.g.

enum WhateverThisfunctionwants {
   Yes,
   No,
}

*[View changes since the review](https://triagebot.infra.rust-lang.org/gh-changes-since/rust-lang/rust/161457/9a4ad59ae3073b013cd62f53f8349ddc61a012e8..5a6f61532811493d3a1fd88aecf71ce42594ec2e)*

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Ops, wanted to clean that up but forgot. Will do. Also yeah, that would make much sense in readability. I can see it being extended in the future so will probably be more beneficial after

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done u.u

write!(self, " + ")?;
}
first = false;
write!(self, "PointeeSized")?;

@lcnr lcnr Aug 28, 2026

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.

do we want somethign like... we do repeat this pattern a lot

let mut first = false;
let mut print_bound = |bound| {
    if !first {
        write!(self, " + ")?;
        first = false;
    }
    self.write_str(bound)
}; 


*[View changes since the review](https://triagebot.infra.rust-lang.org/gh-changes-since/rust-lang/rust/161457/9a4ad59ae3073b013cd62f53f8349ddc61a012e8..5a6f61532811493d3a1fd88aecf71ce42594ec2e)*

.collect()
} else {
clauses.into_iter().collect()
};

@lcnr lcnr Aug 28, 2026

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.

that one is unfortunately somewhat problematic. gather_explicit_clauses_of is used by a query whose result we write to crate metadata, so this would erase the Move bound from upstream crates which don't have the feature enabled.

Why is this needed

View changes since the review

@zannabianca1997 zannabianca1997 Aug 28, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Of the changes that I made this is the one i was less sure of

I was trying to fix this test

The original test expected

error[E0091]: type parameter `N` is never used
  --> $DIR/unused-type-param-suggestion.rs:25:8
   |
LL | type D<N: ?Sized> = ();
   |        ^ unused type parameter
   |
   = help: consider removing `N` or referring to it in the body of the type alias

and after the change with Move it appeared a new help message = help: if you intended Nto be a const parameter, useconst N: /* Type */ instead

now, the help should not appear as there is a bound - so i checked from where it came, and got to read the check_type_alias_type_params_are_used that uses some sort of euristic to split huser written bounds and the sized hierarchy (?)

I honestly lost the plot there, but noticed that it was calling the _explicit_ version. And I saw the doc comment of gather_explicit_clauses_of noting that implied and inferred constraints should not appear there, and Move is indeed implicit in that case, so I just aligned it

@rust-bors

This comment has been minimized.

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

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants