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)
