-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #88525 - notriddle:notriddle/coherence-dyn-auto-trait…
…, r=petrochenkov fix(rustc_typeck): produce better errors for dyn auto trait Fixes #85026
- Loading branch information
Showing
5 changed files
with
71 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
An inherent `impl` was written on a dyn auto trait. | ||
|
||
Erroneous code example: | ||
|
||
```compile_fail,E0785 | ||
#![feature(auto_traits)] | ||
auto trait AutoTrait {} | ||
impl dyn AutoTrait {} | ||
``` | ||
|
||
Dyn objects allow any number of auto traits, plus at most one non-auto trait. | ||
The non-auto trait becomes the "principal trait". | ||
|
||
When checking if an impl on a dyn trait is coherent, the principal trait is | ||
normally the only one considered. Since the erroneous code has no principal | ||
trait, it cannot be implemented at all. | ||
|
||
Working example: | ||
|
||
``` | ||
#![feature(auto_traits)] | ||
trait PrincipalTrait {} | ||
auto trait AutoTrait {} | ||
impl dyn PrincipalTrait + AutoTrait + Send {} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#![feature(auto_traits)] | ||
auto trait AutoTrait {} | ||
|
||
// You cannot impl your own `dyn AutoTrait`. | ||
impl dyn AutoTrait {} //~ERROR E0785 | ||
|
||
// You cannot impl someone else's `dyn AutoTrait` | ||
impl dyn Unpin {} //~ERROR E0785 | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
error[E0785]: cannot define inherent `impl` for a dyn auto trait | ||
--> $DIR/issue-85026.rs:5:6 | ||
| | ||
LL | impl dyn AutoTrait {} | ||
| ^^^^^^^^^^^^^ impl requires at least one non-auto trait | ||
| | ||
= note: define and implement a new trait or type instead | ||
|
||
error[E0785]: cannot define inherent `impl` for a dyn auto trait | ||
--> $DIR/issue-85026.rs:8:6 | ||
| | ||
LL | impl dyn Unpin {} | ||
| ^^^^^^^^^ impl requires at least one non-auto trait | ||
| | ||
= note: define and implement a new trait or type instead | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0785`. |