// Copyright (c) 2012, 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.
// Test correct usage of inlined double temporary objects.

main() {
  for (int i = 0; i < 2000; i++) {
    testBinaryOp();
    testUnaryOp();
  }
}


// VM: temporary double should not be used as result of division,
// otherwise the function always returns the same object.
double divide(double a, double b) {
  return a / b;
}

testBinaryOp() {
  var x = divide(1.0, 2.0);
  var y = divide(2.0, 3.0);
  Expect.notEquals(x, y);
}


// VM: temporary double should be used only for "-b", otherwise the
// function would always return the same object.
double unary(double a, double b) {
  return -(a * (-b));
}


testUnaryOp() {
  var x = unary(1.0, 2.0);
  var y = unary(3.0, 4.0);
  Expect.equals(2.0, x);
}
