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

typedef MyList<T extends core::num> = core::List<T>;
static method main() → dynamic {
  self::expect(true, #C1);
  self::expect(false, #C2);
  self::expect(true, core::identical(#C4, #C4));
  self::expect(false, core::identical(#C4, #C6));
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
  core::bool v4 = core::identical(v1, v2);
  core::bool v5 = core::identical(v1, v3);
  self::expect(true, v4);
  self::expect(false, v5);
  self::expect(true, core::identical(v1, v2));
  self::expect(false, core::identical(v1, v3));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
  return core::_List::•<self::_#MyList#new#tearOff::T>(length);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);

constants  {
  #C1 = true
  #C2 = false
  #C3 = constructor-tearoff core::List::filled
  #C4 = instantiation #C3 <core::num*>
  #C5 = static-tearoff self::_#MyList#filled#tearOff
  #C6 = instantiation #C5 <core::num*>
  #C7 = null
}

Extra constant evaluation status:
Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:18:16 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///issue47462.dart:19:17 -> BoolConstant(false)
Extra constant evaluation: evaluated: 52, effectively constant: 2
