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(covariant-by-class 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)
