title: Why is there a difference regarding lifetime elision of impl trait function arguments between async and non-async functions?
body: <p>This code compiles:</p>
  <pre class="lang-rust prettyprint-override"><code>async fn foo(_: impl Iterator&lt;Item = &amp;u32&gt;) {}
  </code></pre>
  <p>However, removing the <code>async</code>, it does not work anymore:</p>
  <pre class="lang-rust prettyprint-override"><code>fn foo(_: impl Iterator&lt;Item = &amp;u32&gt;) {}
  </code></pre>
  <p>Instead, it results in:</p>
  <pre class="lang-none prettyprint-override"><code>error[E0106]: missing lifetime specifier
   --&gt; src/lib.rs:1:32
    |
  1 | fn foo(_: impl Iterator&lt;Item = &amp;u32&gt;) {}
    |                                ^ expected named lifetime parameter
    |
  help: consider introducing a named lifetime parameter
    |
  1 | fn foo&lt;'a&gt;(_: impl Iterator&lt;Item = &amp;'a u32&gt;) {}
    |       ^^^^                         ^^^
  </code></pre>
  <p>(<a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=1600f9f8c737e04c38e05c2a6348333f" rel="noreferrer">Playground</a>)</p>
  <p>Why is there a difference regarding lifetime elision between <code>async</code> and non-<code>async</code> functions? This makes no sense to me. It seems like the non-<code>async</code> case could easily leave out the lifetime as well. It's just introducing another anonymous input lifetime.</p>