-
Notifications
You must be signed in to change notification settings - Fork 0
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
Making it possible to call super trait methods with bound on the subtrait #2
Comments
…mpiler-errors properly elaborate effects implied bounds for super traits Summary: This PR makes it so that we elaborate `<T as Tr>::Fx: EffectsCompat<somebool>` into `<T as SuperTr>::Fx: EffectsCompat<somebool>` when we know that `trait Tr: ~const SuperTr`. Some discussion at rust-lang/project-const-traits#2. r? project-const-traits `@rust-lang/project-const-traits:` how do we feel about this approach?
Stop me if I'm being naive, but how hard would it be to just hardcode the list of supertraits in the desugared bounds? (Now that's a tongue-twister.) So your example could desugar to this: fn foo<const RUNTIME: bool, T: Bar>(t: &T)
where
Param<RUNTIME>: Sub<<T as Bar>::Fx>,
Param<RUNTIME>: Sub<<T as Foo>::Fx>,
{
t.a();
} It's not super efficient, but I'm pretty sure 99.9% of trait hierarchies in any Rust codebase have under five traits in them, so this solution doesn't add huge amounts of extra work. EDIT - Oh, this is basically rust-lang/rust#129499 |
…mpiler-errors properly elaborate effects implied bounds for super traits Summary: This PR makes it so that we elaborate `<T as Tr>::Fx: EffectsCompat<somebool>` into `<T as SuperTr>::Fx: EffectsCompat<somebool>` when we know that `trait Tr: ~const SuperTr`. Some discussion at rust-lang/project-const-traits#2. r? project-const-traits `@rust-lang/project-const-traits:` how do we feel about this approach?
…rors properly elaborate effects implied bounds for super traits Summary: This PR makes it so that we elaborate `<T as Tr>::Fx: EffectsCompat<somebool>` into `<T as SuperTr>::Fx: EffectsCompat<somebool>` when we know that `trait Tr: ~const SuperTr`. Some discussion at rust-lang/project-const-traits#2. r? project-const-traits `@rust-lang/project-const-traits:` how do we feel about this approach?
This should be finished ✨ |
We'll start with the sugar version:
This currently fails compilation, and making a desugaring that makes this work is apparently hard. I'll illustrate this issue by first desugaring it.
Note that this desugaring uses some types from a PR that has not yet landed. See this diff for more info.
This errors because the bound on
Foo::a
isn't satisfied (specificallyParam<RUNTIME>: Sub<Self::Fx>
) Now one way to do this is maybe make the compiler know thatSub
is a transitive trait, such thatA: Sub<B>, B: Sub<C>
would together implyA: Sub<C>
. But that could be very complicated.I'm not entirely sure how else to approach it. There might be other desugarings that would make this work, but none was able to escape this transitive implication thing I think.
The text was updated successfully, but these errors were encountered: