Index: tests/kernel/unsorted/finally_contexts_test.dart |
diff --git a/tests/kernel/unsorted/finally_contexts_test.dart b/tests/kernel/unsorted/finally_contexts_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6f89114dc1141e1004fe26d3cd75ef88f0198e63 |
--- /dev/null |
+++ b/tests/kernel/unsorted/finally_contexts_test.dart |
@@ -0,0 +1,47 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'expect.dart'; |
+ |
+// Test that the context depth is correct in the presence of control flow, |
+// specifically branching and joining in the presence of break. The |
+// implementation uses the context depth after the else block of an if/then/else |
+// as the context depth at the join point. This test has an extra context |
+// allocated in the (untaken) else branch so it tests that compiling the |
+// (untaken) break properly tracks the context depth. |
+ |
+test(list) { |
+ // The loops force creation of a new context, otherwise context allocated |
+ // variables might be hoisted to an outer context. |
+ do { |
+ if (list.length > 1) { |
+ do { |
+ var sum = 0; |
+ addem() { |
+ for (var x in list) sum += x; |
+ } |
+ addem(); |
+ Expect.isTrue(sum == 15); |
+ L: if (sum != 15) { |
+ // Unreachable. |
+ do { |
+ var product = 1; |
+ multiplyem() { |
+ for (var x in list) product *= x; |
+ } |
+ multiplyem(); |
+ Expect.isTrue(false); |
+ break L; |
+ } while (false); |
+ } |
+ } while (false); |
+ } |
+ } while (false); |
+ Expect.isTrue(list.length == 5); |
+} |
+ |
+ |
+main() { |
+ test([1, 2, 3, 4, 5]); |
+} |