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

/*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];
}
