| // Copyright (c) 2014, 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. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| // Regression test for issue 17483. |
| |
| class A { |
| var x, y; |
| A(x, this.y) { |
| this.x = x; |
| } |
| toString() => "a"; |
| } |
| |
| foo(trace) => trace.add("foo"); |
| bar(trace) => trace.add("bar"); |
| |
| main() { |
| var trace = []; |
| // Dart2js must keep the order of t1 and t2. |
| var t1 = foo(trace); |
| var t2 = bar(trace); |
| // Dart2js inlines the constructor, yielding something like: |
| // t3 = jsNew A(null, t2); // Note that jsNew is pure. |
| // t3.x = t1; |
| // t3 is used twice and cannot be generated at use site. |
| // Dart2js must not allow t1 to cross the t3-line. |
| var a = new A(t1, t2); |
| // Use a. It is already implicitly used by the this.x = x line in its |
| // constructor. With the following use we use it twice and make sure that |
| // the allocation can not be generated at use-site. |
| trace.add(a.toString()); |
| Expect.listEquals(["foo", "bar", "a"], trace); |
| } |