Index: tests/language/issue9939_test.dart |
=================================================================== |
--- tests/language/issue9939_test.dart (revision 0) |
+++ tests/language/issue9939_test.dart (revision 0) |
@@ -0,0 +1,43 @@ |
+// Copyright (c) 2013, 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. |
+ |
+// dart2js was generating incorrect code for the [A] constructor, by |
+// using a temporary variable for two instructions, even though they |
+// are both live at the same time. |
+ |
+import "package:expect/expect.dart"; |
+ |
+var globalVar = [1, 2]; |
+ |
+class A { |
+ final field1; |
+ final field2; |
+ var field3; |
+ |
+ A(this.field1, this.field2) { |
+ bool entered = false; |
+ // We use [field1] twice to ensure it will have a temporary. |
+ for (var a in field1) { |
+ try { |
+ entered = true; |
+ // We use [field2] twice to ensure it will have a temporary. |
+ print(field2); |
+ print(field2); |
+ } catch (e) { |
+ // Because the catch is aborting, the SSA graph we used to |
+ // generate thought that the whole try/catch was aborting, and |
+ // therefore it could not reach the code after the loop. |
+ throw e; |
+ } |
+ } |
+ Expect.isTrue(entered); |
+ // dart2js used to overwrite the temporary for [field1] with |
+ // [field2]. |
+ Expect.equals(globalVar, field1); |
+ } |
+} |
+ |
+main() { |
+ new A(globalVar, null); |
+} |