| A closure or generator was constructed that references its own type. | |
| Erroneous code example: | |
| ```compile_fail,E0644 | |
| fn fix<F>(f: &F) | |
| where F: Fn(&F) | |
| { | |
| f(&f); | |
| } | |
| fn main() { | |
| fix(&|y| { | |
| // Here, when `x` is called, the parameter `y` is equal to `x`. | |
| }); | |
| } | |
| ``` | |
| Rust does not permit a closure to directly reference its own type, | |
| either through an argument (as in the example above) or by capturing | |
| itself through its environment. This restriction helps keep closure | |
| inference tractable. | |
| The easiest fix is to rewrite your closure into a top-level function, | |
| or into a method. In some cases, you may also be able to have your | |
| closure call itself by capturing a `&Fn()` object or `fn()` pointer | |
| that refers to itself. That is permitting, since the closure would be | |
| invoking itself via a virtual call, and hence does not directly | |
| reference its own *type*. |