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>
FE/analyzer shared code
This package contains logic that is shared between the front_end and analyzer packages. It is intended solely to facilitate development of the Dart SDK, and is not intended for use by end users. In particular, this package has no public API, so no guarantee is made of compatibility between one version of the package and the next.
End users should consider using the analyzer package to analyze Dart source code.