// Copyright (c) 2020, 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.14

/*member: main:ignore*/
void main() {
  for (var a in [false, true]) {
    sink = cannotRecognize(a ? 10 : C());
    sink = unspecialized(a ? -1 : 1);
    sink = otherPositive2(a);
    sink = shiftBySix(a);
    sink = shiftByMasked(a, 9);
    sink = shiftByMasked(a, -9);
  }

  sink = cannotConstantFold();
  sink = constantFoldPositive();
  sink = constantFoldNegative();
  test6();
}

Object? sink;

@pragma('dart2js:noInline')
/*spec.member: cannotRecognize:function(thing) {
  return H._asInt(J.$shru$n(thing, 1));
}*/
/*prod.member: cannotRecognize:function(thing) {
  return J.$shru$n(thing, 1);
}*/
/*canary.member: cannotRecognize:function(thing) {
  return B._asInt(J.$shru$n(thing, 1));
}*/
int cannotRecognize(dynamic thing) {
  return thing >>> 1;
}

@pragma('dart2js:noInline')
/*spec|prod.member: cannotConstantFold:function() {
  return C.JSInt_methods.$shru(1, -1);
}*/
/*canary.member: cannotConstantFold:function() {
  return A.JSInt_methods.$shru(1, -1);
}*/
int cannotConstantFold() {
  var a = 1;
  return a >>> -1;
}

@pragma('dart2js:noInline')
/*member: constantFoldPositive:function() {
  return 25;
}*/
int constantFoldPositive() {
  var a = 100;
  return a >>> 2;
}

@pragma('dart2js:noInline')
/*member: constantFoldNegative:function() {
  return 3;
}*/
int constantFoldNegative() {
  var a = -1;
  return a >>> 30;
}

@pragma('dart2js:noInline')
/*spec|prod.member: unspecialized:function(a) {
  return C.JSInt_methods.$shru(1, a);
}*/
/*canary.member: unspecialized:function(a) {
  return A.JSInt_methods.$shru(1, a);
}*/
int unspecialized(int a) {
  return 1 >>> a;
}

@pragma('dart2js:noInline')
/*spec|prod.member: otherPositive2:function(param) {
  return C.JSInt_methods._shruOtherPositive$1(1, param ? 1 : 2);
}*/
/*canary.member: otherPositive2:function(param) {
  return A.JSInt_methods._shruOtherPositive$1(1, param ? 1 : 2);
}*/
int otherPositive2(bool param) {
  var a = param ? 1 : 2;
  return 1 >>> a;
}

@pragma('dart2js:noInline')
/*member: shiftBySix:function(param) {
  return (param ? 4294967295 : -1) >>> 6;
}*/
int shiftBySix(bool param) {
  var a = param ? 0xFFFFFFFF : -1;
  return a >>> 6;
}

@pragma('dart2js:noInline')
/*member: shiftByMasked:function(param1, shift) {
  var a = param1 ? 4294967295 : 0;
  return a >>> (shift & 31);
}*/
int shiftByMasked(bool param1, int shift) {
  var a = param1 ? 0xFFFFFFFF : 0;
  return a >>> (shift & 31);
}

@pragma('dart2js:noInline')
/*spec|prod.member: otherPositive6:function(a, b) {
  return C.JSInt_methods._shruOtherPositive$1(a, b);
}*/
/*canary.member: otherPositive6:function(a, b) {
  return A.JSInt_methods._shruOtherPositive$1(a, b);
}*/
int otherPositive6(int a, int b) {
  return a >>> b;
}

void test6() {
  sink = otherPositive6(1, 3);
  sink = otherPositive6(0, 4);
  sink = otherPositive6(-1, 2);
}

class C {
  /*member: C.>>>:ignore*/
  C operator >>>(int i) => this;
}
