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

/*member: main:[null]*/
main() {
  assignPlus();
  assignAnd();
  instanceAssignPlus();
  instanceAssignAnd();
  assignIndexPlus();
  assignIndexAnd();
  assignIndexInc();
  assignIndexDec();
}

////////////////////////////////////////////////////////////////////////////////

/*member: assignPlus:[subclass=JSUInt32]*/
assignPlus() {
  var i = 87;
  return i /*invoke: [exact=JSUInt31]*/ += 42;
}

/*member: assignAnd:[exact=JSUInt31]*/
assignAnd() {
  var i = 87;
  return i /*invoke: [exact=JSUInt31]*/ &= 42;
}

/*member: Class1.:[exact=Class1]*/
class Class1 {
  /*member: Class1.field:[subclass=JSPositiveInt]*/
  var field = 87;
}

/*member: instanceAssignPlus:[subclass=JSPositiveInt]*/
instanceAssignPlus() {
  var c = new Class1();
  return c. /*[exact=Class1]*/ /*update: [exact=Class1]*/ field /*invoke: [subclass=JSPositiveInt]*/ +=
      42;
}

/*member: Class2.:[exact=Class2]*/
class Class2 {
  /*member: Class2.field:[exact=JSUInt31]*/
  var field = 87;
}

/*member: instanceAssignAnd:[exact=JSUInt31]*/
instanceAssignAnd() {
  var c = new Class2();
  return c. /*[exact=Class2]*/ /*update: [exact=Class2]*/ field /*invoke: [exact=JSUInt31]*/ &=
      42;
}

/*member: assignIndexPlus:[subclass=JSPositiveInt]*/
assignIndexPlus() {
  var i = [87];
  return i
      /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
      /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
      [0] /*invoke: [subclass=JSPositiveInt]*/ += 42;
}

/*member: assignIndexAnd:[exact=JSUInt31]*/
assignIndexAnd() {
  var i = [87];
  return i
      /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
      /*update: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
      [0] /*invoke: [exact=JSUInt31]*/ &= 42;
}

/*member: assignIndexInc:[subclass=JSPositiveInt]*/
assignIndexInc() {
  var i = [87];
  return i
      /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
      /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
      [0] /*invoke: [subclass=JSPositiveInt]*/ ++;
}

/*member: assignIndexDec:[subclass=JSInt]*/
assignIndexDec() {
  var i = [87];
  return /*invoke: [subclass=JSInt]*/ --i
      /*Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
      /*update: Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
      [0];
}
