At first sight, this compiles and works fine. Am I missing something? Does this have perf issues? It does get rid of an unsafe block and a bunch of code.
Also, I wonder for something like this, is it really useful to keep the #[inline] mention? I would think LLVM would figure out what's best?
Both versions work because FutureObj<T> is Unpin for any T. The upstream implementation works with or without unpin, so I'm guessing it either didn't used to be unpin, this code predates the current unpin logic, or the author used the usual pinning projection code for consistency.
The two should perform equivalently.
The #[inline] shouldn't be necessary in an ideal world, but you'll find it a lot in library code providing combinators and type wrappers, where it really can make a difference if the complier's inlining heuristics fail. I saved 6% on a binary recently using async by placing a carefully considered #[inline].