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::num::==}(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}();
static method fn2() → core::String
  return (#C9).{self::B::toString}();
static method fn3() → core::int
  return (#C11).{self::C::fn}();
static method fn4() → core::int
  return (#C13).{self::C::fn}();
static method fn5() → core::int
  return (#C14).{self::D::fn}();
static method fn6() → core::int
  return (#C15).{self::C::fn}();
static method fn7() → core::String
  return (#C16).{self::F::fn}("string");
static method fn8() → core::String
  return (#C17).{self::F::fn}("string");
static method main() → void {
  exp::Expect::equals(#C2, (#C8).{core::Object::toString}());
  exp::Expect::equals(#C2, (#C8).{core::Object::toString}());
  exp::Expect::equals(#C3, (#C9).{self::B::toString}());
  exp::Expect::equals(#C3, (#C9).{self::B::toString}());
  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)
