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

// @dart = 2.9

import "package:expect/expect.dart";

constants() {
  Expect.equals(0x80000000, 0x80000000 | 0);
  Expect.equals(0x80000001, 0x80000000 | 1);
  Expect.equals(0x80000000, 0x80000000 | 0x80000000);
  Expect.equals(0xFFFFFFFF, 0xFFFF0000 | 0xFFFF);
  Expect.equals(0x80000000, 0x80000000 & 0xFFFFFFFF);
  Expect.equals(0x80000000, 0x80000000 & 0x80000000);
  Expect.equals(0x80000000, 0x80000000 & 0xF0000000);
  Expect.equals(0x80000000, 0xFFFFFFFF & 0x80000000);
  Expect.equals(0x80000000, 0x80000000 ^ 0);
  Expect.equals(0xFFFFFFFF, 0x80000000 ^ 0x7FFFFFFF);
  Expect.equals(0xFFFFFFFF, 0x7FFFFFFF ^ 0x80000000);
  Expect.equals(0xF0000000, 0x70000000 ^ 0x80000000);
  Expect.equals(0x80000000, 1 << 31);
  Expect.equals(0xFFFFFFF0, 0xFFFFFFF << 4);
  Expect.equals(0x7FFFFFFF, 0xFFFFFFFF >> 1);
  Expect.equals(
      0xFFFFFFFC,
      ((((((0xFFFFFFF << 4) // 0xFFFFFFF0
                          >>
                          1) // 0x7FFFFFF8
                      |
                      0x80000000) // 0xFFFFFFF8
                  >>
                  2) // 0x3FFFFFFE
              ^
              0x40000000) // 0x7FFFFFFE
          <<
          1));
}

foo(i) {
  if (i != 0) {
    y--;
    foo(i - 1);
    y++;
  }
}

var y;

// id returns [x] in a way that should be difficult to predict statically.
id(x) {
  y = x;
  foo(10);
  return y;
}

interceptors() {
  Expect.equals(0x80000000, id(0x80000000) | id(0));
  Expect.equals(0x80000001, id(0x80000000) | id(1));
  Expect.equals(0x80000000, id(0x80000000) | id(0x80000000));
  Expect.equals(0xFFFFFFFF, id(0xFFFF0000) | id(0xFFFF));
  Expect.equals(0x80000000, id(0x80000000) & id(0xFFFFFFFF));
  Expect.equals(0x80000000, id(0x80000000) & id(0x80000000));
  Expect.equals(0x80000000, id(0x80000000) & id(0xF0000000));
  Expect.equals(0x80000000, id(0xFFFFFFFF) & id(0x80000000));
  Expect.equals(0x80000000, id(0x80000000) ^ id(0));
  Expect.equals(0xFFFFFFFF, id(0x80000000) ^ id(0x7FFFFFFF));
  Expect.equals(0xFFFFFFFF, id(0x7FFFFFFF) ^ id(0x80000000));
  Expect.equals(0xF0000000, id(0x70000000) ^ id(0x80000000));
  Expect.equals(0x80000000, id(1) << id(31));
  Expect.equals(0xFFFFFFF0, id(0xFFFFFFF) << id(4));
  Expect.equals(0x7FFFFFFF, id(0xFFFFFFFF) >> id(1));
  Expect.equals(
      0xFFFFFFFC,
      ((((((id(0xFFFFFFF) << 4) // 0xFFFFFFF0
                          >>
                          1) // 0x7FFFFFF8
                      |
                      0x80000000) // 0xFFFFFFF8
                  >>
                  2) // 0x3FFFFFFE
              ^
              0x40000000) // 0x7FFFFFFE
          <<
          1));
}

speculative() {
  var a = id(0x80000000);
  var b = id(0);
  var c = id(1);
  var d = id(0xFFFF0000);
  var e = id(0xFFFF);
  var f = id(0xFFFFFFFF);
  var g = id(0xF0000000);
  var h = id(0x7FFFFFFF);
  var j = id(0x70000000);
  var k = id(31);
  var l = id(4);
  var m = id(0xFFFFFFF);
  for (int i = 0; i < 1; i++) {
    Expect.equals(0x80000000, a | b);
    Expect.equals(0x80000001, a | c);
    Expect.equals(0x80000000, a | a);
    Expect.equals(0xFFFFFFFF, d | e);
    Expect.equals(0x80000000, a & f);
    Expect.equals(0x80000000, a & a);
    Expect.equals(0x80000000, a & g);
    Expect.equals(0x80000000, f & a);
    Expect.equals(0x80000000, a ^ b);
    Expect.equals(0xFFFFFFFF, a ^ h);
    Expect.equals(0xFFFFFFFF, h ^ a);
    Expect.equals(0xF0000000, j ^ a);
    Expect.equals(0x80000000, c << k);
    Expect.equals(0xFFFFFFF0, m << l);
    Expect.equals(0x7FFFFFFF, f >> c);
    Expect.equals(
        0xFFFFFFFC,
        ((((((m << 4) // 0xFFFFFFF0
                            >>
                            1) // 0x7FFFFFF8
                        |
                        0x80000000) // 0xFFFFFFF8
                    >>
                    2) // 0x3FFFFFFE
                ^
                0x40000000) // 0x7FFFFFFE
            <<
            1));
  }
}

// Due to bad precedence rules this example was broken in Dart2Js.
precedence() {
  Expect.equals(0x80000000, -1 & 0x80000000);
  Expect.equals(0x80000000, id(-1) & 0x80000000);
  Expect.equals(0x80000000, ~(~(0x80000000)));
  Expect.equals(0x80000000, ~(~(id(0x80000000))));
}

main() {
  constants();
  interceptors();
  speculative();
  precedence();
}
