library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

class A extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::B
    : super core::Object::•()
    ;
  @#C1
  method toString() → core::String
    return "B";
}
class C extends core::Object /*hasConstConstructor*/  {
  final field core::int y;
  const constructor •(core::int y) → self::C
    : self::C::y = y, super core::Object::•()
    ;
  method fn() → core::int {
    if(this.{self::C::y}{core::int} =={core::num::==}{(core::Object) → core::bool} 1)
      return 100;
    return 200;
  }
}
class D extends self::C /*hasConstConstructor*/  {
  const constructor •(core::int y) → self::D
    : super self::C::•(y)
    ;
  @#C1
  method fn() → core::int
    return 300;
}
class E extends self::C /*hasConstConstructor*/  {
  const constructor •(core::int y) → self::E
    : super self::C::•(y)
    ;
}
class F<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::F<self::F::T%, self::F::U%, self::F::V%>
    : super core::Object::•()
    ;
  method fn(generic-covariant-impl self::F::U% x) → self::F::U%
    return x;
}
class G<T extends core::Object? = dynamic> extends self::F<self::G::T%, core::String, core::num> /*hasConstConstructor*/  {
  const constructor •() → self::G<self::G::T%>
    : super self::F::•()
    ;
}
static const field core::String var1 = #C2;
static const field core::String toString1 = #C2;
static const field core::String var2 = #C3;
static const field core::String toString2 = #C3;
static const field core::int var3 = #C4;
static const field core::int var4 = #C5;
static const field core::int fnVal1 = #C4;
static const field core::int fnVal2 = #C5;
static const field core::int var5 = #C6;
static const field core::int fnVal3 = #C6;
static const field core::int var6 = #C5;
static const field core::int fnVal4 = #C4;
static const field core::String var7 = #C7;
static const field core::String fnVal5 = #C7;
static const field core::String var8 = #C7;
static const field core::String fnVal6 = #C7;
static method fn() → core::String
  return (#C8).{core::Object::toString}(){() → core::String};
static method fn2() → core::String
  return (#C9).{self::B::toString}(){() → core::String};
static method fn3() → core::int
  return (#C11).{self::C::fn}(){() → core::int};
static method fn4() → core::int
  return (#C13).{self::C::fn}(){() → core::int};
static method fn5() → core::int
  return (#C14).{self::D::fn}(){() → core::int};
static method fn6() → core::int
  return (#C15).{self::C::fn}(){() → core::int};
static method fn7() → core::String
  return (#C16).{self::F::fn}("string"){(core::String) → core::String};
static method fn8() → core::String
  return (#C17).{self::F::fn}("string"){(core::String) → core::String};
static method main() → void {
  exp::Expect::equals(#C2, (#C8).{core::Object::toString}(){() → core::String});
  exp::Expect::equals(#C2, (#C8).{core::Object::toString}(){() → core::String});
  exp::Expect::equals(#C3, (#C9).{self::B::toString}(){() → core::String});
  exp::Expect::equals(#C3, (#C9).{self::B::toString}(){() → core::String});
  exp::Expect::equals(#C4, 200);
  exp::Expect::equals(#C5, 100);
  exp::Expect::equals(#C4, 200);
  exp::Expect::equals(#C5, 100);
  exp::Expect::equals(#C6, 300);
  exp::Expect::equals(#C6, 300);
  exp::Expect::equals(#C5, 100);
  exp::Expect::equals(#C4, 200);
  exp::Expect::equals(#C7, "string");
  exp::Expect::equals(#C7, "string");
  exp::Expect::equals(#C7, "string");
  exp::Expect::equals(#C7, "string");
}

constants  {
  #C1 = core::_Override {}
  #C2 = "Instance of 'A'"
  #C3 = "B"
  #C4 = 200
  #C5 = 100
  #C6 = 300
  #C7 = "string"
  #C8 = self::A {}
  #C9 = self::B {}
  #C10 = 0
  #C11 = self::C {y:#C10}
  #C12 = 1
  #C13 = self::C {y:#C12}
  #C14 = self::D {y:#C12}
  #C15 = self::E {y:#C12}
  #C16 = self::F<core::int, core::String, core::num> {}
  #C17 = self::G<core::int> {}
}


Constructor coverage from constants:
org-dartlang-testcase:///const_functions_instance_methods.dart:
- A. (from org-dartlang-testcase:///const_functions_instance_methods.dart:10:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- B. (from org-dartlang-testcase:///const_functions_instance_methods.dart:14:9)
- C. (from org-dartlang-testcase:///const_functions_instance_methods.dart:23:9)
- D. (from org-dartlang-testcase:///const_functions_instance_methods.dart:32:9)
- E. (from org-dartlang-testcase:///const_functions_instance_methods.dart:39:9)
- F. (from org-dartlang-testcase:///const_functions_instance_methods.dart:43:9)
- G. (from org-dartlang-testcase:///const_functions_instance_methods.dart:48:9)
