library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

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::•()
    ;
  @core::override
  method toString() → core::String
    ;
}
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
    ;
}
class D extends self::C /*hasConstConstructor*/  {
  const constructor •(core::int y) → self::D
    : super self::C::•(y)
    ;
  @core::override
  method fn() → core::int
    ;
}
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%
    ;
}
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 = self::fn();
static const field core::String toString1 = const self::A::•().{core::Object::toString}(){() → core::String};
static const field core::String var2 = self::fn2();
static const field core::String toString2 = const self::B::•().{self::B::toString}(){() → core::String};
static const field core::int var3 = self::fn3();
static const field core::int var4 = self::fn4();
static const field core::int fnVal1 = const self::C::•(0).{self::C::fn}(){() → core::int};
static const field core::int fnVal2 = const self::C::•(1).{self::C::fn}(){() → core::int};
static const field core::int var5 = self::fn5();
static const field core::int fnVal3 = const self::D::•(1).{self::D::fn}(){() → core::int};
static const field core::int var6 = self::fn6();
static const field core::int fnVal4 = const self::E::•(0).{self::C::fn}(){() → core::int};
static const field core::String var7 = self::fn7();
static const field core::String fnVal5 = const self::F::•<core::int, core::String, core::num>().{self::F::fn}("string"){(core::String) → core::String};
static const field core::String var8 = self::fn8();
static const field core::String fnVal6 = const self::G::•<core::int>().{self::F::fn}("string"){(core::String) → core::String};
static method fn() → core::String
  ;
static method fn2() → core::String
  ;
static method fn3() → core::int
  ;
static method fn4() → core::int
  ;
static method fn5() → core::int
  ;
static method fn6() → core::int
  ;
static method fn7() → core::String
  ;
static method fn8() → core::String
  ;
static method main() → void
  ;


Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_instance_methods.dart:16:4 -> InstanceConstant(const _Override{})
Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_instance_methods.dart:34:4 -> InstanceConstant(const _Override{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:54:25 -> InstanceConstant(const A{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:59:25 -> InstanceConstant(const B{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:66:22 -> InstanceConstant(const C{C.y: 0})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:67:22 -> InstanceConstant(const C{C.y: 1})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:72:22 -> InstanceConstant(const D{C.y: 1})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:77:22 -> InstanceConstant(const E{C.y: 0})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:82:22 -> InstanceConstant(const F<int*, String*, num*>{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_instance_methods.dart:87:22 -> InstanceConstant(const G<int*>{})
Extra constant evaluation: evaluated: 29, effectively constant: 10
