diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2024-01-09 17:52:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-09 17:52:21 +0100 |
| commit | f4d06256d8bb3c0cc54eee5f53a7012196ac1d29 (patch) | |
| tree | 9ddb850d48658d766a12de4a3dd2bc8b39b3b9df /compiler/rustc_mir_transform/src/coverage/graph.rs | |
| parent | 3da96aed94aa0f72a3632475ccc9510adbb8f8e0 (diff) | |
| parent | 760673e97d48e131b87ec738cb7106c5f8abe55e (diff) | |
| download | rust-f4d06256d8bb3c0cc54eee5f53a7012196ac1d29.tar.gz rust-f4d06256d8bb3c0cc54eee5f53a7012196ac1d29.zip | |
Rollup merge of #119721 - compiler-errors:constness-implication, r=fee1-dead
`~const` trait and projection bounds do not imply their non-const counterparts
This PR removes the hack where we install a non-const trait and projection bound for every `const_trait` and `~const` projection bound we have in the AST. It ends up messing up more things than it fixes, see words below.
Fixes #119718
cc `@fmease` `@fee1-dead` `@oli-obk`
r? fee1-dead or one of y'all i don't care
---
My understanding is that this hack was added to support the following code:
```rust
pub trait Owo<X = <Self as Uwu>::T> {}
#[const_trait]
pub trait Uwu: Owo {}
```
Which is concretely lifted from in the `FromResidual` and `Try` traits. Since within the param-env of `trait Uwu`, we only know that `Self: ~const Uwu` and not `Self: Uwu`, the projection `<Self as Uwu>::T` is not satsifyable.
This causes problems such as #119718, since instantiations of `FnDef` types coming from `const fn` really do **only** implement one of `FnOnce` or `const FnOnce`!
---
In the long-term, I believe that such code should really look something more like:
```rust
#[const_trait]
pub trait Owo<X = <Self as ~const Uwu>::T> {}
#[const_trait]
pub trait Uwu: Owo {}
```
... and that we should introduce some sort of `<T as ~const Foo>::Bar` bound syntax, since due to the fact that `~const` bounds can be present in item bounds, e.g.
```rust
#[const_trait] trait Foo { type Bar: ~const Destruct; }
```
It's easy to see that `<T as Foo>::Bar` and `<T as ~const Foo>::Bar` (or `<T as const Foo>::Bar`) can be distinct types with distinct item bounds!
**Admission**: I know I've said before that I don't like `~const` projection syntax, I do at this point believe they're necessary to fully express bounds and types in a maybe-const world.
Diffstat (limited to 'compiler/rustc_mir_transform/src/coverage/graph.rs')
0 files changed, 0 insertions, 0 deletions
