<p dir="auto">I have been attempting to switch my Future / Stream lib to use associated types, however I have been hitting snags. Even though all the types (as far as I can tell) are bound by Send (and some by 'static too), I have been getting a lot of error messages:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 note: ...so that captured variable `c` does not outlive the enclosing closure
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 note: ...so that captured variable `c` does not outlive the enclosing closure
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),"><pre class="notranslate"><code class="notranslate">/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:43: 90:26 note: ...so that captured variable `c` does not outlive the enclosing closure
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85:30: 90:27 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:88                                 Err(_) =&gt; unimplemented!(),
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:89                             }
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:90                         });
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:31: 94:14 note: ...so that captured variable `c` does not outlive the enclosing closure
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 error: the associated type `&lt;U as util::async::Async&gt;::Value` may not live long enough
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 help: consider adding an explicit lifetime bound `&lt;U as util::async::Async&gt;::Value: 'static`...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
                                                                ...
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82:18: 94:15 note: ...so that the declared lifetime parameter bounds are satisfied
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:82             self.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:83                 match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:84                     Ok(_) =&gt; {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:85                         next.receive(move |res| {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:86                             match res {
/Users/carllerche/Code/mine/syncbox/src/util/async/future.rs:87                                 Ok(u) =&gt; c.complete(u),
</code></pre></div>
<p dir="auto">The repro is trying to compile syncbox on the async-associated-type branch. Sorry for not reducing more <g-emoji class="g-emoji" alias="cry" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f622.png">😢</g-emoji></p>
<p dir="auto"><a href="https://github.com/carllerche/syncbox/tree/async-associated-type">https://github.com/carllerche/syncbox/tree/async-associated-type</a></p>
<p dir="auto">cc <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/nikomatsakis/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/nikomatsakis">@nikomatsakis</a></p>
<p dir="auto">Take this code:</p>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="trait Foo { type Value: 'static; }

fn require_static&lt;T: 'static&gt;() {}

fn takes_foo&lt;F: Foo&gt;() {
  require_static::&lt;F::Value&gt;()
}"><pre class="notranslate"><span class="pl-k">trait</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span> <span class="pl-k">type</span> <span class="pl-smi">Value</span><span class="pl-kos">:</span> <span class="pl-c1">'</span><span class="pl-ent">static</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>

<span class="pl-k">fn</span> <span class="pl-en">require_static</span><span class="pl-kos">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">:</span> <span class="pl-c1">'</span><span class="pl-ent">static</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>

<span class="pl-k">fn</span> <span class="pl-en">takes_foo</span><span class="pl-kos">&lt;</span><span class="pl-smi">F</span><span class="pl-kos">:</span> <span class="pl-smi">Foo</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
  <span class="pl-en">require_static</span><span class="pl-kos">::</span><span class="pl-kos">&lt;</span><span class="pl-smi">F</span><span class="pl-kos">::</span><span class="pl-smi">Value</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">Since <code class="notranslate">Foo::Value</code> is bounded with <code class="notranslate">'static</code>, we would expect this to compile, but instead we get this error message:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;anon&gt;:6:3: 6:29 error: the associated type `&lt;F as Foo&gt;::Value` may not live long enough
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;anon&gt;:6:3: 6:29 help: consider adding an explicit lifetime bound `&lt;F as Foo&gt;::Value: 'static`...
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;anon&gt;:6:3: 6:29 note: ...so that the declared lifetime parameter bounds are satisfied
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error"><pre class="notranslate"><code class="notranslate">&lt;anon&gt;:6:3: 6:29 error: the associated type `&lt;F as Foo&gt;::Value` may not live long enough
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;anon&gt;:6:3: 6:29 help: consider adding an explicit lifetime bound `&lt;F as Foo&gt;::Value: 'static`...
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;anon&gt;:6:3: 6:29 note: ...so that the declared lifetime parameter bounds are satisfied
&lt;anon&gt;:6   require_static::&lt;F::Value&gt;()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
</code></pre></div>
<p dir="auto">Which seems redundant, if not incorrect.</p>
<p dir="auto">playpen: <a href="http://is.gd/UkEaDV" rel="nofollow">http://is.gd/UkEaDV</a></p>
<p dir="auto">cc <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/nikomatsakis/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/nikomatsakis">@nikomatsakis</a> from IRC</p>