Index: tests/language/regress_26175_test.dart |
diff --git a/tests/language/regress_26175_test.dart b/tests/language/regress_26175_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..619afeb01da82b5a5c766b6632e7ceec8fc40a68 |
--- /dev/null |
+++ b/tests/language/regress_26175_test.dart |
@@ -0,0 +1,72 @@ |
+// Copyright (c) 2015, 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 "package:expect/expect.dart"; |
+import "package:async_helper/async_helper.dart"; |
+ |
+// Test that local variable reads and writes are sequenced correctly with |
+// respect to reads and writes in an awaited Future. See issue 26175. |
+ |
+// Reads are sequenced correctly with respect to writes in a Future. |
+Future test1() async { |
+ var x = 'a'; |
+ f() async => x = 'b'; |
+ Expect.equals('abb', '${x}${await f()}${x}'); |
+} |
+ |
+// Writes are sequenced correctly with respect to writes in a Future. |
+Future test2(ignore) async { |
+ var x; |
+ f() async => x = 'b'; |
+ Expect.equals('abb', '${x = 'a'}${await f()}${x}'); |
+} |
+ |
+// Writes are sequenced correctly with respect to reads in a Future. |
+Future test3(ignore) async { |
+ var x = 'a'; |
+ f() async => x; |
+ Expect.equals('bbb', '${x = 'b'}${await f()}${x}'); |
+} |
+ |
+// Repeat the same tests for static variables. |
+var cell = 'a'; |
+ |
+asyncReadCell() async => cell; |
+asyncWriteCell(value) async => cell = value; |
+ |
+Future test4(ignore) async { |
+ // This test assumes that it can read the initial value of cell. |
+ Expect.equals('abb', '${cell}${await asyncWriteCell('b')}${cell}'); |
+} |
+ |
+Future test5(ignore) async { |
+ Expect.equals('abb', '${cell = 'a'}${await asyncWriteCell('b')}${cell}'); |
+} |
+ |
+Future test6(ignore) async { |
+ Expect.equals('bbb', '${cell = 'b'}${await asyncReadCell()}${cell}'); |
+} |
+ |
+// Test that throwing is sequenced correctly with respect to other effects. |
+Future test7(ignore) async { |
+ cell = 'a'; |
+ try { |
+ Expect.equals('unreachable', |
+ '${throw 0}${await asyncWriteCell('b')}${cell}'); |
+ } catch (_) { |
+ Expect.equals('a', cell); |
+ } |
+} |
+ |
+main() { |
+ asyncStart(); |
+ test1() |
+ .then(test2) |
+ .then(test3) |
+ .then(test4) |
+ .then(test5) |
+ .then(test6) |
+ .then(test7) |
+ .then((_) => asyncEnd()); |
+} |