- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Labels
C-bugCategory: This is a bug.Category: This is a bug.I-cycleIssue: A query cycle occurred while none was expectedIssue: A query cycle occurred while none was expectedT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Description
Code
trait Useless {}
impl Useless for () {}
trait Source {
    fn a_function(self) -> impl Useless;
}
struct ABot;
impl Source for ABot {
    fn a_function(self) -> impl Useless {}
}
trait Sink {
    fn run(self) -> impl Useless;
}
struct Bot {
    pub sources: Vec<Box<dyn Source>>,
}
impl Sink for Bot {
    fn run(self) -> impl Useless {
        let _ = self.sources.len();
    }
}
fn main() {}Current output
error[E0391]: cycle detected when checking effective visibilities
   |
note: ...which requires computing type of `<impl at src/main.rs:20:1: 20:18>::run::{opaque#0}`...
  --> src/main.rs:21:21
   |
21 |     fn run(self) -> impl Useless {
   |                     ^^^^^^^^^^^^
note: ...which requires computing type of opaque `<impl at src/main.rs:20:1: 20:18>::run::{opaque#0}`...
  --> src/main.rs:21:21
   |
21 |     fn run(self) -> impl Useless {
   |                     ^^^^^^^^^^^^
note: ...which requires type-checking `<impl at src/main.rs:20:1: 20:18>::run`...
  --> src/main.rs:21:5
   |
21 |     fn run(self) -> impl Useless {
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   = note: ...which again requires checking effective visibilities, completing the cycle
note: cycle used when checking that `Bot` is well-formed
  --> src/main.rs:16:1
   |
16 | struct Bot {
   | ^^^^^^^^^^
   = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
For more information about this error, try `rustc --explain E0391`.Desired output
error[E0038]: the trait `Source` cannot be made into an object
  --> src/main.rs:17:26
   |
17 |     pub sources: Vec<Box<dyn Source>>,
   |                          ^^^^^^^^^^ `Source` cannot be made into an object
   |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
  --> src/main.rs:4:29
   |
3  | trait Source {
   |       ------ this trait cannot be made into an object...
4  |     fn a_function(&self) -> impl Useless;
   |                             ^^^^^^^^^^^^ ...because method `a_function` references an `impl Trait` type in its return type
   = help: consider moving `a_function` to another trait
   = help: only type `ABot` implements the trait, consider using it directly instead
For more information about this error, try `rustc --explain E0038`.Rationale and extra context
No response
Other cases
No response
Anything else?
This code is originally extracted from a reduction of a problem found hit on a friend's project. I reduced the code down to something that, confusingly, provides an incorrect diagnostics message.
Originally, the -> impl Useless dynamic dispatch were async fn, I just substituted them. The nightly toolchain as of today behaves the same.
As a note, the correct output is provided if the statement let _ = self.sources.len(); is commented out, which is why I think this is related to #119346 , but maybe not the same.
Metadata
Metadata
Assignees
Labels
C-bugCategory: This is a bug.Category: This is a bug.I-cycleIssue: A query cycle occurred while none was expectedIssue: A query cycle occurred while none was expectedT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.