From PR #7:
Actually, there's more soundness bugs with the signatures of the future_[de]sync() methods. To illustrate:
use desync::Desync;
use futures::executor;
fn leak_local<T: Send>(v: T) -> &'static mut T {
let desync = Desync::new(v);
let future = desync.future_sync(|v| async { v });
executor::block_on(future).unwrap()
}
This was introduced by the change in v0.8 that removed the need to box the future, I think. The lifetime of the borrow is insufficiently restricted without the higher-order trait bound imposed on the function.