// 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.

// @dart = 2.9

/// Regression test for dart2js that used to miscompile boolean and operations
/// if one of the operands was an int and the other was not (issue 22427).
///
/// Extended to all operations as there is a risk of similar bugs with other
/// operators, e.g. `a % 2` _looks_ like it might be 0 or 1.

import "package:expect/expect.dart";

@pragma('dart2js:assumeDynamic')
@pragma('dart2js:noInline')
confuse(x) => x;

class Thing1 {
  operator &(b) => this;
  operator |(b) => this;
  operator ^(b) => this;
  operator <<(b) => this;
  operator >>(b) => this;

  operator +(b) => this;
  operator -(b) => this;
  operator *(b) => this;
  operator /(b) => this;
  operator ~/(b) => this;
  operator %(b) => this;
  remainder(b) => this;

  operator <(b) => this;
  operator <=(b) => this;
  operator >(b) => this;
  operator >=(b) => this;
}

class Thing2 {
  @pragma('dart2js:noInline')
  operator &(b) => this;
  @pragma('dart2js:noInline')
  operator |(b) => this;
  @pragma('dart2js:noInline')
  operator ^(b) => this;
  @pragma('dart2js:noInline')
  operator <<(b) => this;
  @pragma('dart2js:noInline')
  operator >>(b) => this;

  @pragma('dart2js:noInline')
  operator +(b) => this;
  @pragma('dart2js:noInline')
  operator -(b) => this;
  @pragma('dart2js:noInline')
  operator *(b) => this;
  @pragma('dart2js:noInline')
  operator /(b) => this;
  @pragma('dart2js:noInline')
  operator ~/(b) => this;
  @pragma('dart2js:noInline')
  operator %(b) => this;
  @pragma('dart2js:noInline')
  remainder(b) => this;

  @pragma('dart2js:noInline')
  operator <(b) => this;
  @pragma('dart2js:noInline')
  operator <=(b) => this;
  @pragma('dart2js:noInline')
  operator >(b) => this;
  @pragma('dart2js:noInline')
  operator >=(b) => this;
}

confused() {
  var a = new Thing1();
  Expect.equals(a, confuse(a) & 5 & 2);
  Expect.equals(a, confuse(a) | 5 | 2);
  Expect.equals(a, confuse(a) ^ 5 ^ 2);
  Expect.equals(a, confuse(a) << 5 << 2);
  Expect.equals(a, confuse(a) >> 5 >> 2);

  Expect.equals(a, confuse(a) + 5 + 2);
  Expect.equals(a, confuse(a) - 5 - 2);
  Expect.equals(a, confuse(a) * 5 * 2);
  Expect.equals(a, confuse(a) / 5 / 2);
  Expect.equals(a, confuse(a) % 5 % 2);
  Expect.equals(a, confuse(a) ~/ 5 ~/ 2);
  Expect.equals(a, confuse(a).remainder(5).remainder(2));

  Expect.equals(a, (confuse(a) < 5) < 2);
  Expect.equals(a, (confuse(a) <= 5) <= 2);
  Expect.equals(a, (confuse(a) > 5) > 2);
  Expect.equals(a, (confuse(a) >= 5) >= 2);
}

direct1() {
  var a = new Thing1();
  Expect.equals(a, a & 5 & 2);
  Expect.equals(a, a | 5 | 2);
  Expect.equals(a, a ^ 5 ^ 2);
  Expect.equals(a, a << 5 << 2);
  Expect.equals(a, a >> 5 >> 2);

  Expect.equals(a, a + 5 + 2);
  Expect.equals(a, a - 5 - 2);
  Expect.equals(a, a * 5 * 2);
  Expect.equals(a, a / 5 / 2);
  Expect.equals(a, a % 5 % 2);
  Expect.equals(a, a ~/ 5 ~/ 2);
  Expect.equals(a, a.remainder(5).remainder(2));

  Expect.equals(a, (a < 5) < 2);
  Expect.equals(a, (a <= 5) <= 2);
  Expect.equals(a, (a > 5) > 2);
  Expect.equals(a, (a >= 5) >= 2);
}

direct2() {
  var a = new Thing2();
  Expect.equals(a, a & 5 & 2);
  Expect.equals(a, a | 5 | 2);
  Expect.equals(a, a ^ 5 ^ 2);
  Expect.equals(a, a << 5 << 2);
  Expect.equals(a, a >> 5 >> 2);

  Expect.equals(a, a + 5 + 2);
  Expect.equals(a, a - 5 - 2);
  Expect.equals(a, a * 5 * 2);
  Expect.equals(a, a / 5 / 2);
  Expect.equals(a, a % 5 % 2);
  Expect.equals(a, a ~/ 5 ~/ 2);
  Expect.equals(a, a.remainder(5).remainder(2));

  Expect.equals(a, (a < 5) < 2);
  Expect.equals(a, (a <= 5) <= 2);
  Expect.equals(a, (a > 5) > 2);
  Expect.equals(a, (a >= 5) >= 2);
}

main() {
  confused();
  direct1();
  direct2();
}
