Yes. The problem is that deeply nested enums are generated. There would be no problem if they were flattened.

Another problem: if you need to select between N different futures and run them concurrently, you will use O(N^2) time if you use a combinator.

Root cause in both cases is that events propagate top-down, when they should propagate bottom-up, as they do in all other languages. Top-down event propagation is linear in the size of the call stack, whereas bottom-up takes amortized constant time.

With bottom-up propagation, the event loop holds, in addition to the future, a token that tells which future to poll next. It them polls that future directly, without checking its parent. If and only if that future returns Async::Ready does the parent future get polled.

I believe the reason that these problems have not appeared before is that few Rust programs use deep call stacks.