async fn bar(input: u32) -> i32 {
        let blah = input > 10; // Preamble
        let result = foo(blah).await;
        result * 2 // Postamble
    }
> If only we were allowed to execute the code up to the first await point, then we could get rid of the Unresumed state. But "futures don't do anything unless polled" is guaranteed, so we can't change that.

Is that actually valid reasoning? If we know that foo(blah) doesn’t do “anything” until polled, then why can’t bar call foo without polling it before foo itself is polled? After all, there’s no “anything” that will happen.

Because foo might call process::abort().

I disagree. If the codegen / optimizer is trying to preserve the rule that futures don’t have side effects until polled, then it seems fine to assume that the future being wrapped also follows that rule.

So if I call a foo() that violates the rule, it seems odd to complain that the generated bar() also violates it.

[deleted]