[flow analysis] Fix layering of type promotions in try/finally. A tricky part of the implementation of flow analysis is the handling of try/finally statements. Although promotions are tracked separately in the `try` and `finally` blocks, promotions from both blocks need to be merged together at the conclusion of the finally block. This creates an ambiguity, because each type in a promotion chain is required to be a subtype of the previous, and hence multiple promotions of the same variable are inherently ordered. The ambiguity is: when the promotions from the `try` and `finally` block are merged, which promotions should be applied first? In discussion with the language team, we've decided that the promotions from the `try` block should be applied first, because that matches the order of code execution. This change makes the behavior of flow analysis more uniform, which should make it easier to reason about and maintain. In practice, the difference in behavior is quite subtle, and I don't expect users to notice. However, to be on the safe side, the change in behavior is conditioned on the `sound-flow-analysis` flag, so it will only take effect when the user deliberately upgrades to language version 3.9, and it will not affect already-published packages. A test in google3 showed that no internal code would be broken by force-enabling this change. Fixes https://github.com/dart-lang/language/issues/4382. Change-Id: I0e9f6db808a964e0b4325d3020654a9f2be273a2 Bug: https://github.com/dart-lang/language/issues/4382 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432001 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com> https://dart.googlesource.com/sdk/+/9f0e5229fa1cf0769da9d84896670a2e93e229ce
diff --git a/DEPS b/DEPS index f41297e..03afe36 100644 --- a/DEPS +++ b/DEPS
@@ -235,7 +235,7 @@ ] deps = { - 'flutter/engine/src/flutter/third_party/dart': Var('dart_git') + '/sdk' + '@' + '5f9c5da23871fe4a232b80c91f021104755e70e0', + 'flutter/engine/src/flutter/third_party/dart': Var('dart_git') + '/sdk' + '@' + '9f0e5229fa1cf0769da9d84896670a2e93e229ce', 'flutter': Var('flutter_git') + '/mirrors/flutter' + '@' + '406199ca71f44f403162e4f37fff6ba14f701f31',
diff --git a/commits.json b/commits.json index d156884..e84335a 100644 --- a/commits.json +++ b/commits.json
@@ -1,4 +1,4 @@ { "flutter":"406199ca71f44f403162e4f37fff6ba14f701f31", - "flutter/engine/src/flutter/third_party/dart":"5f9c5da23871fe4a232b80c91f021104755e70e0" + "flutter/engine/src/flutter/third_party/dart":"9f0e5229fa1cf0769da9d84896670a2e93e229ce" } \ No newline at end of file