// 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);
}
