Closed
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.