`cargo doc` shows different return for re-exported methods

I noticed some strange behaviour: type definitions for async fns have a
different return type depending on if they're exported from a dependency.


smol::UdpSocket shows:

pub async fn bind<A>(addr: A) -> impl Future<Output = Result<UdpSocket, Error>>where
  A: AsyncToSocketAddrs,

async_net::UdpSocket shows:

pub async fn bind<A: AsyncToSocketAddrs>(addr: A) -> Result<UdpSocket>

The same results happen if I run cargo doc locally for the smol and async-net projects.

I would have expected the same type signature here? Is this expected?


Both function signatures are equivalent. In the direct case it is probably what was written in the source code, but in the re-export case the exact thing that was written is lost and rustdoc has to emit a canonical form instead.

No, look at the return type. They're both async, so that first one returns a future that returns a future that returns a result. The second one returns a future that returns a result (which looks like the correct one).


I can reproduce this using the latest nightly, and I couldn’t easily find the issue reported anywhere yet. So someone might want to open a new one.


Excellent. Thanks for the review, all!

I opened cargo doc: shows different return types for re-exported methods · Issue #115760 · rust-lang/rust · GitHub.