// 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: returnNum1:Union([exact=JSDouble], [exact=JSUInt31])*/
returnNum1(/*Value([exact=JSBool], value: true)*/ a) {
  if (a)
    return 1;
  else
    return 2.5;
}

/*element: returnNum2:Union([exact=JSDouble], [exact=JSUInt31])*/
returnNum2(/*Value([exact=JSBool], value: true)*/ a) {
  if (a)
    return 1.4;
  else
    return 2;
}

/*element: returnInt1:[exact=JSUInt31]*/
returnInt1(/*Value([exact=JSBool], value: true)*/ a) {
  if (a)
    return 1;
  else
    return 2;
}

/*element: returnDouble:[exact=JSDouble]*/
returnDouble(/*Value([exact=JSBool], value: true)*/ a) {
  if (a)
    return 1.5;
  else
    return 2.5;
}

/*element: returnGiveUp:Union([exact=JSString], [exact=JSUInt31])*/
returnGiveUp(/*Value([exact=JSBool], value: true)*/ a) {
  if (a)
    return 1;
  else
    return 'foo';
}

/*element: returnInt2:[exact=JSUInt31]*/
returnInt2() {
  var a = 42;
  return a /*invoke: [exact=JSUInt31]*/ ++;
}

/*element: returnInt5:[subclass=JSUInt32]*/
returnInt5() {
  var a = 42;
  return /*invoke: [exact=JSUInt31]*/ ++a;
}

/*element: returnInt6:[subclass=JSUInt32]*/
returnInt6() {
  var a = 42;
  a /*invoke: [exact=JSUInt31]*/ ++;
  return a;
}

/*element: returnIntOrNull:[null|exact=JSUInt31]*/
returnIntOrNull(/*Value([exact=JSBool], value: true)*/ a) {
  if (a) return 42;
}

/*element: returnInt3:[exact=JSUInt31]*/
returnInt3(/*Value([exact=JSBool], value: true)*/ a) {
  if (a) return 42;
  throw 42;
}

/*element: returnInt4:[exact=JSUInt31]*/
returnInt4() {
  return (42);
}

/*element: returnInt7:[subclass=JSPositiveInt]*/
returnInt7() {
  return 42. /*invoke: [exact=JSUInt31]*/ abs();
}

/*element: returnInt8:[subclass=JSPositiveInt]*/
returnInt8() {
  return 42. /*invoke: [exact=JSUInt31]*/ remainder(54);
}

/*element: returnEmpty1:[empty]*/
returnEmpty1() {
  // Ensure that we don't intrisify a wrong call to [int.remainder].
  dynamic a = 42;
  return a. /*invoke: [exact=JSUInt31]*/ remainder();
}

/*element: returnEmpty2:[empty]*/
returnEmpty2() {
  // Ensure that we don't intrisify a wrong call to [int.abs].
  dynamic a = 42;
  return a. /*invoke: [exact=JSUInt31]*/ abs(42);
}

/*element: testIsCheck1:[subclass=JSInt]*/
testIsCheck1(/*[null|subclass=Object]*/ a) {
  if (a is int) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck2:[subclass=JSInt]*/
testIsCheck2(/*[null|subclass=Object]*/ a) {
  if (a is! int) {
    return 0;
  } else {
    return a;
  }
}

/*element: testIsCheck3:[null|subclass=JSInt]*/
testIsCheck3(/*[null|subclass=Object]*/ a) {
  if (a is! int) {
    print('hello');
  } else {
    return a;
  }
}

/*element: testIsCheck4:[subclass=JSInt]*/
testIsCheck4(/*[null|subclass=Object]*/ a) {
  if (a is int) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck5:[subclass=JSInt]*/
testIsCheck5(/*[null|subclass=Object]*/ a) {
  if (a is! int) {
    return 42;
  } else {
    return a;
  }
}

/*element: testIsCheck6:[null|subclass=Object]*/
testIsCheck6(/*[null|subclass=Object]*/ a) {
  if (a is! int) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck7:[subclass=JSInt]*/
testIsCheck7(/*[null|subclass=Object]*/ a) {
  if (a == 'foo' && a is int) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck8:[null|subclass=Object]*/
testIsCheck8(/*[null|subclass=Object]*/ a) {
  if (a == 'foo' || a is int) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck9:[subclass=JSInt]*/
testIsCheck9(/*[null|subclass=Object]*/ a) {
  return a is int ? a : 42;
}

/*element: testIsCheck10:[null|subclass=Object]*/
testIsCheck10(/*[null|subclass=Object]*/ a) {
  return a is! int ? a : 42;
}

/*element: testIsCheck11:[subclass=JSInt]*/
testIsCheck11(/*[null|subclass=Object]*/ a) {
  return a is! int ? 42 : a;
}

/*element: testIsCheck12:[null|subclass=Object]*/
testIsCheck12(/*[null|subclass=Object]*/ a) {
  return a is int ? 42 : a;
}

/*element: testIsCheck13:[subclass=JSInt]*/
testIsCheck13(/*[null|subclass=Object]*/ a) {
  while (a is int) {
    return a;
  }
  return 42;
}

/*element: testIsCheck14:[null|subclass=Object]*/
testIsCheck14(/*[null|subclass=Object]*/ a) {
  while (a is! int) {
    return 42;
  }
  return a;
}

// TODO(29309): Change to [subclass=JSInt] when 29309 is fixed.
/*element: testIsCheck15:[null|subclass=Object]*/
testIsCheck15(/*[null|subclass=Object]*/ a) {
  dynamic c = 42;
  do {
    if (a) return c;
    c = topLevelGetter();
  } while (c is int);
  return 42;
}

/*element: testIsCheck16:[null|subclass=Object]*/
testIsCheck16(/*[null|subclass=Object]*/ a) {
  dynamic c = 42;
  do {
    if (a) return c;
    c = topLevelGetter();
  } while (c is! int);
  return 42;
}

/*element: testIsCheck17:[subclass=JSInt]*/
testIsCheck17(/*[null|subclass=Object]*/ a) {
  dynamic c = 42;
  for (; c is int;) {
    if (a) return c;
    c = topLevelGetter();
  }
  return 42;
}

/*element: testIsCheck18:[null|subclass=Object]*/
testIsCheck18(/*[null|subclass=Object]*/ a) {
  dynamic c = 42;
  for (; c is int;) {
    if (a) return c;
    c = topLevelGetter();
  }
  return c;
}

/*element: testIsCheck19:[null|subclass=Object]*/
testIsCheck19(/*[null|subclass=Object]*/ a) {
  dynamic c = 42;
  for (; c is! int;) {
    if (a) return c;
    c = topLevelGetter();
  }
  return 42;
}

/*element: testIsCheck20:[exact=JSUInt31]*/
testIsCheck20() {
  var c = topLevelGetter();
  if (c != null && c is! bool && c is! int) {
    return 42;
  } else if (c is String) {
    return c;
  } else {
    return 68;
  }
}

/*element: testIsCheck21:Union([subclass=JSArray], [subclass=JSInt])*/
testIsCheck21(/*[null|subclass=Object]*/ a) {
  if (a is int || a is List) {
    return a;
  } else {
    return 42;
  }
}

/*element: testIsCheck22:Union([subclass=JSArray], [subclass=JSInt])*/
testIsCheck22(/*[null|subclass=Object]*/ a) {
  return (a is int || a is List) ? a : 42;
}

/*element: testIsCheck23:[subclass=JSInt]*/
testIsCheck23(/*[null|subclass=Object]*/ a) {
  if (a is! int) throw 'foo';
  return a;
}

/*element: testIsCheck24:[subclass=JSInt]*/
testIsCheck24(/*[null|subclass=Object]*/ a) {
  if (a is! int) return 42;
  return a;
}

/*element: testIsCheck25:[null|subclass=Object]*/
testIsCheck25(/*[null|subclass=Object]*/ a) {
  if (a is int) throw 'foo';
  return a;
}

/*element: testIsCheck26:[subclass=JSInt]*/
testIsCheck26(/*[null|subclass=Object]*/ a) {
  if (a is int) {
  } else {
    throw 42;
  }
  return a;
}

/*element: testIsCheck27:[subclass=JSInt]*/
testIsCheck27(/*[null|subclass=Object]*/ a) {
  if (a is int) {
  } else {
    return 42;
  }
  return a;
}

/*element: testIsCheck28:[null|subclass=Object]*/
testIsCheck28(/*[null|subclass=Object]*/ a) {
  if (a is int) {
  } else {}
  return a;
}

/*element: testIsCheck29:[null|subclass=Object]*/
testIsCheck29(/*[null|subclass=Object]*/ a) {
  if (a is int) {}
  return a;
}

/*element: testIf1:[null|exact=JSUInt31]*/
testIf1(/*[null|subclass=Object]*/ a) {
  var c = null;
  if (a) {
    c = 10;
  } else {}
  return c;
}

/*element: testIf2:[null|exact=JSUInt31]*/
testIf2(/*[null|subclass=Object]*/ a) {
  var c = null;
  if (a) {
  } else {
    c = 10;
  }
  return c;
}

/*element: returnAsString:[null|exact=JSString]*/
returnAsString() {
  return topLevelGetter() as String;
}

/*element: returnIntAsNum:[exact=JSUInt31]*/
returnIntAsNum() {
  dynamic a = 0;
  return a as num;
}

typedef int Foo();

/*element: returnAsTypedef:[null|subclass=Closure]*/
returnAsTypedef() {
  return topLevelGetter() as Foo;
}

/*element: testDeadCode:[exact=JSUInt31]*/
testDeadCode() {
  return 42;
  // ignore: dead_code
  return 'foo';
}

/*element: testLabeledIf:[null|exact=JSUInt31]*/
testLabeledIf(/*Value([exact=JSBool], value: true)*/ a) {
  var c;
  L1:
  if (a /*invoke: Value([exact=JSBool], value: true)*/ > 1) {
    if (a /*invoke: [empty]*/ == 2) {
      break L1;
    }
    c = 42;
  } else {
    c = 38;
  }
  return c;
}

/*element: testSwitch1:Union([exact=JSUInt31], [null|exact=JSDouble])*/
testSwitch1() {
  var a = null;
  switch (topLevelGetter) {
    case 100:
      a = 42.5;
      break;
    case 200:
      a = 42;
      break;
  }
  return a;
}

/*element: testSwitch2:[exact=JSUInt31]*/
testSwitch2() {
  var a = null;
  switch (topLevelGetter) {
    case 100:
      a = 42;
      break;
    case 200:
      a = 42;
      break;
    default:
      a = 43;
  }
  return a;
}

/*element: testSwitch3:Union([exact=JSString], [null|subclass=JSNumber])*/
testSwitch3() {
  dynamic a = 42;
  var b;
  switch (topLevelGetter) {
    L1:
    case 1:
      b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 42;
      break;
    case 2:
      a = 'foo';
      continue L1;
  }
  return b;
}

/*element: testSwitch4:[exact=JSUInt31]*/
testSwitch4() {
  switch (topLevelGetter) {
    case 1:
      break;
    default:
      break;
  }
  return 42;
}

/*element: testSwitch5:[exact=JSUInt31]*/
testSwitch5() {
  switch (topLevelGetter) {
    case 1:
      return 1;
    default:
      return 2;
  }
}

/*element: testContinue1:Union([exact=JSString], [null|subclass=JSNumber])*/
testContinue1() {
  dynamic a = 42;
  var b;
  while (true) {
    b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 54;
    if (b /*invoke: Union([exact=JSString], [subclass=JSNumber])*/ == 42)
      continue;
    a = 'foo';
  }
  // ignore: dead_code
  return b;
}

/*element: testBreak1:Union([null|exact=JSString], [subclass=JSUInt32])*/
testBreak1() {
  var a = 42;
  var b;
  while (true) {
    b = a /*invoke: [exact=JSUInt31]*/ + 54;
    if (b /*invoke: [subclass=JSUInt32]*/ == 42) break;
    b = 'foo';
  }
  return b;
}

/*element: testContinue2:Union([exact=JSString], [null|subclass=JSUInt32])*/
testContinue2() {
  var a = 42;
  var b;
  while (true) {
    b = a /*invoke: [exact=JSUInt31]*/ + 54;
    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
      b = 'foo';
      continue;
    }
  }
  // ignore: dead_code
  return b;
}

/*element: testBreak2:[null|subclass=JSUInt32]*/
testBreak2() {
  dynamic a = 42;
  var b;
  while (true) {
    b = a /*invoke: [exact=JSUInt31]*/ + 54;
    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
      a = 'foo';
      break;
    }
  }
  return b;
}

/*element: testReturnElementOfConstList1:[exact=JSUInt31]*/
testReturnElementOfConstList1() {
  return const [
    42
  ] /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [
      0];
}

/*element: testReturnElementOfConstList2:[exact=JSUInt31]*/
testReturnElementOfConstList2() {
  return topLevelConstList /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [
      0];
}

/*element: testReturnItselfOrInt:[exact=JSUInt31]*/
testReturnItselfOrInt(/*[null|subclass=Object]*/ a) {
  if (a) return 42;
  return testReturnItselfOrInt(a);
}

/*element: testDoWhile1:Value([exact=JSString], value: "foo")*/
testDoWhile1() {
  dynamic a = 42;
  do {
    a = 'foo';
  } while (true);
  // ignore: dead_code
  return a;
}

/*element: testDoWhile2:[null]*/
testDoWhile2() {
  dynamic a = 42;
  do {
    a = 'foo';
    // ignore: mixed_return_types
    return;
  } while (true);
  // ignore: dead_code,mixed_return_types
  return a;
}

/*element: testDoWhile3:[exact=JSUInt31]*/
testDoWhile3() {
  dynamic a = 42;
  do {
    a = 'foo';
    if (true) continue;
    return 42;
  } while (true);
  // ignore: dead_code
  return a;
}

/*element: testDoWhile4:Union([exact=JSDouble], [exact=JSUInt31])*/
testDoWhile4() {
  dynamic a = 'foo';
  do {
    a = 54;
    if (true) break;
    return 3.5;
  } while (true);
  return a;
}

/*element: testSpecialization1:[subclass=JSNumber]*/
testSpecialization1() {
  var a = topLevelGetter();
  a - 42;
  return a;
}

/*element: testSpecialization2:[null|subclass=Object]*/
testSpecialization2() {
  var a = topLevelGetter();
  // Make [a] a captured variable. This should disable receiver
  // specialization on [a].
  (
      /*[null|exact=JSString]*/
      () => a.toString())();
  a - 42;
  return a;
}

/*element: testSpecialization3:[null|exact=JSUInt31]*/
testSpecialization3() {
  var a = returnDynamic() ? null : 42;
  a. /*invoke: [null|exact=JSUInt31]*/ toString();
  // Test that calling an [Object] method on [a] will not lead to
  // infer that [a] is not null;
  return a;
}

/*element: testReturnNull1:[null]*/
testReturnNull1(/*[null|subclass=Object]*/ a) {
  if (a == null) return a;
  return null;
}

/*element: testReturnNull2:[null]*/
testReturnNull2(/*[null|subclass=Object]*/ a) {
  if (a != null) return null;
  return a;
}

/*element: testReturnNull3:[null|subclass=Object]*/
testReturnNull3(/*[null|subclass=Object]*/ a) {
  if (a == null) return 42;
  return a;
}

/*element: testReturnNull4:[null]*/
testReturnNull4() {
  var a = topLevelGetter();
  if (a == null) return a;
  return null;
}

/*element: testReturnNull5:[null]*/
testReturnNull5() {
  var a = topLevelGetter();
  if (a != null) return null;
  return a;
}

/*element: testReturnNull6:[null|subclass=Object]*/
testReturnNull6() {
  var a = topLevelGetter();
  if (a == null) return 42;
  return a;
}

/*element: testReturnNotEquals:[exact=JSBool]*/
testReturnNotEquals() {
  return new A() /*invoke: [exact=A]*/ != 54;
}

/*element: testReturnInvokeDynamicGetter:[null|subclass=Object]*/
testReturnInvokeDynamicGetter() => new A(). /*invoke: [exact=A]*/ myFactory();

/*element: topLevelConstList:Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/
var topLevelConstList = const [42];

/*element: topLevelGetter:[exact=JSUInt31]*/
get topLevelGetter => 42;

/*element: returnDynamic:[null|subclass=Object]*/
returnDynamic() => topLevelGetter(42);

/*element: returnTopLevelGetter:[exact=JSUInt31]*/
returnTopLevelGetter() => topLevelGetter;

class A {
  factory A() = A.generative;

  /*element: A.generative:[exact=A]*/
  A.generative();

  /*element: A.==:[exact=JSBool]*/
  operator ==(/*Union([exact=JSString], [exact=JSUInt31])*/ other) =>
      42 as dynamic;

  /*element: A.myField:[exact=JSUInt31]*/
  get myField => 42;

  set myField(/*[subclass=JSUInt32]*/ a) {}

  /*element: A.returnInt1:[subclass=JSUInt32]*/
  returnInt1() => /*invoke: [exact=JSUInt31]*/ ++ /*[subclass=A]*/ /*update: [subclass=A]*/ myField;

  /*element: A.returnInt2:[subclass=JSUInt32]*/
  returnInt2() => /*invoke: [exact=JSUInt31]*/ ++this
      . /*[subclass=A]*/ /*update: [subclass=A]*/ myField;

  /*element: A.returnInt3:[subclass=JSUInt32]*/
  returnInt3() =>
      this. /*[subclass=A]*/ /*update: [subclass=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
          42;

  /*element: A.returnInt4:[subclass=JSUInt32]*/
  returnInt4() => /*[subclass=A]*/ /*update: [subclass=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
      42;

  /*element: A.[]:[exact=JSUInt31]*/
  operator [](/*[exact=JSUInt31]*/ index) => 42;

  /*element: A.[]=:[null]*/
  operator []=(/*[exact=JSUInt31]*/ index, /*[subclass=JSUInt32]*/ value) {}

  /*element: A.returnInt5:[subclass=JSUInt32]*/
  returnInt5() => /*invoke: [exact=JSUInt31]*/ ++this /*[subclass=A]*/ /*update: [subclass=A]*/ [
      0];

  /*element: A.returnInt6:[subclass=JSUInt32]*/
  returnInt6() => this /*[subclass=A]*/ /*update: [subclass=A]*/ [
      0] /*invoke: [exact=JSUInt31]*/ += 1;

  /*element: A.myFactory:[subclass=Closure]*/
  get myFactory => /*[exact=JSUInt31]*/ () => 42;
}

class B extends A {
  /*element: B.:[exact=B]*/
  B() : super.generative();

  /*element: B.returnInt1:[subclass=JSUInt32]*/
  returnInt1() => /*invoke: [exact=JSUInt31]*/ ++new A()
      . /*[exact=A]*/ /*update: [exact=A]*/ myField;

  /*element: B.returnInt2:[subclass=JSUInt32]*/
  returnInt2() => new A()
      . /*[exact=A]*/ /*update: [exact=A]*/ myField /*invoke: [exact=JSUInt31]*/ += 4;

  /*element: B.returnInt3:[subclass=JSUInt32]*/
  returnInt3() => /*invoke: [exact=JSUInt31]*/ ++new A() /*[exact=A]*/ /*update: [exact=A]*/ [
      0];

  /*element: B.returnInt4:[subclass=JSUInt32]*/
  returnInt4() => new A() /*[exact=A]*/ /*update: [exact=A]*/ [
      0] /*invoke: [exact=JSUInt31]*/ += 42;

  /*element: B.returnInt5:[subclass=JSUInt32]*/
  returnInt5() => /*invoke: [exact=JSUInt31]*/ ++super.myField;

  /*element: B.returnInt6:[subclass=JSUInt32]*/
  returnInt6() => super.myField /*invoke: [exact=JSUInt31]*/ += 4;

  /*element: B.returnInt7:[subclass=JSUInt32]*/
  returnInt7() => /*invoke: [exact=JSUInt31]*/ ++super[0];

  /*element: B.returnInt8:[subclass=JSUInt32]*/
  returnInt8() => super[0] /*invoke: [exact=JSUInt31]*/ += 54;

  /*element: B.returnInt9:[exact=JSUInt31]*/
  returnInt9() => super.myField;
}

class C {
  /*element: C.myField:[subclass=JSPositiveInt]*/
  var myField = 42;

  /*element: C.:[exact=C]*/
  C();

  /*element: C.returnInt1:[subclass=JSPositiveInt]*/
  returnInt1() => /*invoke: [subclass=JSPositiveInt]*/ ++ /*[exact=C]*/ /*update: [exact=C]*/ myField;

  /*element: C.returnInt2:[subclass=JSPositiveInt]*/
  returnInt2() => /*invoke: [subclass=JSPositiveInt]*/ ++this
      . /*[exact=C]*/ /*update: [exact=C]*/ myField;

  /*element: C.returnInt3:[subclass=JSPositiveInt]*/
  returnInt3() =>
      this. /*[exact=C]*/ /*update: [exact=C]*/ myField /*invoke: [subclass=JSPositiveInt]*/ +=
          42;

  /*element: C.returnInt4:[subclass=JSPositiveInt]*/
  returnInt4() => /*[exact=C]*/ /*update: [exact=C]*/ myField /*invoke: [subclass=JSPositiveInt]*/ +=
      42;

  /*element: C.[]:[subclass=JSPositiveInt]*/
  operator [](/*[exact=JSUInt31]*/ index) => /*[exact=C]*/ myField;

  /*element: C.[]=:[null]*/
  operator []=(
      /*[exact=JSUInt31]*/ index,
      /*[subclass=JSPositiveInt]*/ value) {}

  /*element: C.returnInt5:[subclass=JSPositiveInt]*/
  returnInt5() => /*invoke: [subclass=JSPositiveInt]*/ ++this /*[exact=C]*/ /*update: [exact=C]*/ [
      0];

  /*element: C.returnInt6:[subclass=JSPositiveInt]*/
  returnInt6() => this /*[exact=C]*/ /*update: [exact=C]*/ [
      0] /*invoke: [subclass=JSPositiveInt]*/ += 1;
}

/*element: testCascade1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
testCascade1() {
  return [1, 2, 3]
    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
        add(4)
    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
        add(5);
}

/*element: testCascade2:[exact=CascadeHelper]*/
testCascade2() {
  return new CascadeHelper()
    .. /*update: [exact=CascadeHelper]*/ a = "hello"
    .. /*update: [exact=CascadeHelper]*/ b = 42
    .. /*[exact=CascadeHelper]*/ /*update: [exact=CascadeHelper]*/ i
        /*invoke: [subclass=JSPositiveInt]*/ += 1;
}

/*element: CascadeHelper.:[exact=CascadeHelper]*/
class CascadeHelper {
  /*element: CascadeHelper.a:Value([null|exact=JSString], value: "hello")*/
  var a;

  /*element: CascadeHelper.b:[null|exact=JSUInt31]*/
  var b;

  /*element: CascadeHelper.i:[subclass=JSPositiveInt]*/
  var i = 0;
}

/*element: main:[null]*/
main() {
  // Ensure a function class is being instantiated.
  /*[exact=JSUInt31]*/ () => 42;
  returnNum1(true);
  returnNum2(true);
  returnInt1(true);
  returnInt2();
  returnInt3(true);
  returnInt4();
  returnDouble(true);
  returnGiveUp(true);
  returnInt5();
  returnInt6();
  returnInt7();
  returnInt8();
  returnIntOrNull(true);
  returnDynamic();
  returnEmpty1();
  returnEmpty2();
  testIsCheck1(topLevelGetter());
  testIsCheck2(topLevelGetter());
  testIsCheck3(topLevelGetter());
  testIsCheck4(topLevelGetter());
  testIsCheck5(topLevelGetter());
  testIsCheck6(topLevelGetter());
  testIsCheck7(topLevelGetter());
  testIsCheck8(topLevelGetter());
  testIsCheck9(topLevelGetter());
  testIsCheck10(topLevelGetter());
  testIsCheck11(topLevelGetter());
  testIsCheck12(topLevelGetter());
  testIsCheck13(topLevelGetter());
  testIsCheck14(topLevelGetter());
  testIsCheck15(topLevelGetter());
  testIsCheck16(topLevelGetter());
  testIsCheck17(topLevelGetter());
  testIsCheck18(topLevelGetter());
  testIsCheck19(topLevelGetter());
  testIsCheck20();
  testIsCheck21(topLevelGetter());
  testIsCheck22(topLevelGetter());
  testIsCheck23(topLevelGetter());
  testIsCheck24(topLevelGetter());
  testIsCheck25(topLevelGetter());
  testIsCheck26(topLevelGetter());
  testIsCheck27(topLevelGetter());
  testIsCheck28(topLevelGetter());
  testIsCheck29(topLevelGetter());
  testIf1(topLevelGetter());
  testIf2(topLevelGetter());
  returnAsString();
  returnIntAsNum();
  returnAsTypedef();
  returnTopLevelGetter();
  testDeadCode();
  testLabeledIf(true);
  testSwitch1();
  testSwitch2();
  testSwitch3();
  testSwitch4();
  testSwitch5();
  testContinue1();
  testBreak1();
  testContinue2();
  testBreak2();
  testDoWhile1();
  testDoWhile2();
  testDoWhile3();
  testDoWhile4();
  new A() == null;
  new A()
    .. /*invoke: [exact=A]*/ returnInt1()
    .. /*invoke: [exact=A]*/ returnInt2()
    .. /*invoke: [exact=A]*/ returnInt3()
    .. /*invoke: [exact=A]*/ returnInt4()
    .. /*invoke: [exact=A]*/ returnInt5()
    .. /*invoke: [exact=A]*/ returnInt6();

  new B()
    .. /*invoke: [exact=B]*/ returnInt1()
    .. /*invoke: [exact=B]*/ returnInt2()
    .. /*invoke: [exact=B]*/ returnInt3()
    .. /*invoke: [exact=B]*/ returnInt4()
    .. /*invoke: [exact=B]*/ returnInt5()
    .. /*invoke: [exact=B]*/ returnInt6()
    .. /*invoke: [exact=B]*/ returnInt7()
    .. /*invoke: [exact=B]*/ returnInt8()
    .. /*invoke: [exact=B]*/ returnInt9();

  new C()
    .. /*invoke: [exact=C]*/ returnInt1()
    .. /*invoke: [exact=C]*/ returnInt2()
    .. /*invoke: [exact=C]*/ returnInt3()
    .. /*invoke: [exact=C]*/ returnInt4()
    .. /*invoke: [exact=C]*/ returnInt5()
    .. /*invoke: [exact=C]*/ returnInt6();
  testReturnElementOfConstList1();
  testReturnElementOfConstList2();
  testReturnItselfOrInt(topLevelGetter());
  testReturnInvokeDynamicGetter();
  testCascade1();
  testCascade2();
  testSpecialization1();
  testSpecialization2();
  testSpecialization3();
  testReturnNull1(topLevelGetter());
  testReturnNull2(topLevelGetter());
  testReturnNull3(topLevelGetter());
  testReturnNull4();
  testReturnNull5();
  testReturnNull6();
  testReturnNotEquals();
}
