| commit | f51fb064cc8ab9e1f19f497925ac09976eb22672 | [log] [tgz] |
|---|---|---|
| author | Paul Berry <paulberry@google.com> | Thu Oct 08 21:42:14 2020 +0000 |
| committer | Paul Berry <paulberry@google.com> | Thu Oct 08 21:42:14 2020 +0000 |
| tree | 210035dd63716454650ec7adf2e785cd27a5f3d6 | |
| parent | ef1646697cbb5d0c179cb803741bbe413e72035f [diff] |
Ensure that try/catch statements promote properly in unreachable code. Bug: https://github.com/dart-lang/sdk/issues/40009 Change-Id: Ie4b8809c6f37ff67891bc874c0c0ec10c70eb9fa Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/166660 Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart index a451138..f29e2d8 100644 --- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart +++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -3255,6 +3255,7 @@ @override void tryCatchStatement_bodyBegin() { + _current = _current.split(); _stack.add(new _TryContext<Variable, Type>(_current)); } @@ -3301,7 +3302,7 @@ void tryCatchStatement_end() { _TryContext<Variable, Type> context = _stack.removeLast() as _TryContext<Variable, Type>; - _current = context._afterBodyAndCatches; + _current = context._afterBodyAndCatches.unsplit(); } @override
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart index 760b77b..733c471 100644 --- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart +++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart
@@ -201,3 +201,23 @@ } /*int*/ o; } + +tryCatchPromoteInTry(Object o) { + return; + try { + if (o is! int) return; + } catch (_) { + return; + } + /*int*/ o; +} + +tryCatchPromoteInCatch(Object o) { + return; + try { + return; + } catch (_) { + if (o is! int) return; + } + /*int*/ o; +}