3eb697c0af
An `await` expression or `yield` statement suspends the current function and allows other code in the same isolate to execute. In the case of nested functions, an `await` or `yield` in the inner function can allow the outer function to continue executing. That means that if the inner function promotes a local variable belonging to the outer function, then it isn't sound to carry that promotion past an `await` or `yield`. This change fixes the unsoundness by adding a flow analysis method `suspension`, which the shared type analysis logic uses to tell flow analysis that an `await` or `yield` has been found. The `suspension` method un-does the promotions of any variables that might be written to while the inner function is suspended. Fixes https://github.com/dart-lang/sdk/issues/62889. Change-Id: I77eaf997159819a7c50f44b67174d2aa6a6a6964 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/499382 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com>
This directory contains tests of the language and core library implementations. For more information, see https://github.com/dart-lang/sdk/tree/main/docs/Testing.md.