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

/*element: main:[null]*/
main() {
  ifThenNullCheck(0);
  ifThenNullCheck(null);
  ifThenElseNullCheck(0);
  ifThenElseNullCheck(null);
  ifNotThenNullCheck(0);
  ifNotThenNullCheck(null);
  ifNotThenElseNullCheck(0);
  ifNotThenElseNullCheck(null);
  ifThenNotNullComplexCheck(0, 0);
  ifThenNotNullComplexCheck(null, null);
  ifThenElseNotNullComplexCheck(0, 0);
  ifThenElseNotNullComplexCheck(null, null);
  ifThenNotNullGradualCheck1(0, 0);
  ifThenNotNullGradualCheck1(null, 0);
  ifThenNotNullGradualCheck2(0, 0);
  ifThenNotNullGradualCheck2(null, 0);
}

/*element: ifThenNullCheck:[exact=JSUInt31]*/
ifThenNullCheck(int /*[null|exact=JSUInt31]*/ value) {
  if (value == null) {
    return 0;
  }
  return value;
}

/*element: ifThenElseNullCheck:[exact=JSUInt31]*/
ifThenElseNullCheck(int /*[null|exact=JSUInt31]*/ value) {
  if (value == null) {
    return 0;
  } else {
    return value;
  }
}

/*element: ifNotThenNullCheck:[exact=JSUInt31]*/
ifNotThenNullCheck(int /*[null|exact=JSUInt31]*/ value) {
  if (value != null) {
    return value;
  }
  return 0;
}

/*element: ifNotThenElseNullCheck:[exact=JSUInt31]*/
ifNotThenElseNullCheck(int /*[null|exact=JSUInt31]*/ value) {
  if (value != null) {
    return value;
  } else {
    return 0;
  }
}

/*element: ifThenNotNullComplexCheck:[exact=JSUInt31]*/
ifThenNotNullComplexCheck(
    int /*[null|exact=JSUInt31]*/ a, int /*[null|exact=JSUInt31]*/ b) {
  if (a != null && a /*invoke: [exact=JSUInt31]*/ != b) {
    return a;
  }
  return 0;
}

/*element: ifThenElseNotNullComplexCheck:[null|exact=JSUInt31]*/
ifThenElseNotNullComplexCheck(
    int /*[null|exact=JSUInt31]*/ a, int /*[null|exact=JSUInt31]*/ b) {
  if (a != null && a /*invoke: [exact=JSUInt31]*/ != b) {
    return a;
  }
  return a;
}

/*element: ifThenNotNullGradualCheck1:[exact=JSUInt31]*/
ifThenNotNullGradualCheck1(
    int /*[null|exact=JSUInt31]*/ a, int /*[exact=JSUInt31]*/ b) {
  if (a /*invoke: [null|exact=JSUInt31]*/ != b) {
    if (a != null) {
      return a;
    }
  }
  return 0;
}

/*element: ifThenNotNullGradualCheck2:[exact=JSUInt31]*/
ifThenNotNullGradualCheck2(
    int /*[null|exact=JSUInt31]*/ a, int /*[exact=JSUInt31]*/ b) {
  if (a != null) {
    if (a /*invoke: [exact=JSUInt31]*/ != b) {
      return a;
    }
  }
  return 0;
}
