diff options
| author | bors <bors@rust-lang.org> | 2024-02-15 19:16:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-02-15 19:16:06 +0000 |
| commit | b656f5171bfecfe748ef365c80c3935abe189141 (patch) | |
| tree | da7c1a43838b3516eaef7e25a14fa9cd96cd6793 /tests/ui/structs-enums/tuple-struct-construct.rs | |
| parent | cbddf31863495050e840571d2730c95b29dcc27f (diff) | |
| parent | ec8e8981930d1b2dfc950fb23ee6fa9e792f6172 (diff) | |
| download | rust-b656f5171bfecfe748ef365c80c3935abe189141.tar.gz rust-b656f5171bfecfe748ef365c80c3935abe189141.zip | |
Auto merge of #119338 - compiler-errors:upcast-plus-autos, r=lcnr
Consider principal trait ref's auto-trait super-traits in dyn upcasting
Given traits like:
```rust
trait Subtrait: Supertrait + Send {}
trait Supertrait {}
```
We should be able to upcast `dyn Subtrait` to `dyn Supertrait + Send`. This is not currently possible, because when upcasting, we look at the list of auto traits in the object type (`dyn Subtrait`, which has no auto traits in its bounds) and compare them to the target's auto traits (`dyn Supertrait + Send`, which has `Send` in its bound).
Since the target has auto traits that are not present in the source, the upcasting fails. This is overly restrictive, since `dyn Subtrait` will always implement `Send` via its built-in object impl. I propose to loosen this restriction here.
r? types
---
### ~~Aside: Fix this in astconv instead?~~
### edit: This causes too many failures. See https://github.com/rust-lang/rust/pull/119825#issuecomment-1890847150
We may also fix this by by automatically elaborating all auto-trait supertraits during `AstConv::conv_object_ty_poly_trait_ref`. That is, we can make it so that `dyn Subtrait` is elaborated into the same type of `dyn Subtrait + Send`.
I'm open to considering this solution instead, but it would break coherence in the following example:
```rust
trait Foo: Send {}
trait Bar {}
impl Bar for dyn Foo {}
impl Bar for dyn Foo + Send {}
//~^ This would begin to be an overlapping impl.
```
Diffstat (limited to 'tests/ui/structs-enums/tuple-struct-construct.rs')
0 files changed, 0 insertions, 0 deletions
