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

import "dart:async";
import "org-dartlang-testcase:///const_canonical_type_lib.dart" as oo;

typedef F1 = () → con::A<FutureOr<dynamic>>;
typedef F2 = () → con::A<dynamic>;
typedef F3 = () → con::A<FutureOr<FutureOr<dynamic>?>>;
typedef F4 = () → con::A<dynamic>;
class Check extends core::Object /*hasConstConstructor*/  {
  final field dynamic _ignored;
  const constructor •(dynamic x, dynamic y) → self::Check
    : assert(core::identical(x, y)), self::Check::_ignored = core::identical(x, y) ?{core::int} 42 : 1.{core::num::~/}(0), super core::Object::•()
    ;
}
static method expectEqual(dynamic x, dynamic y) → void {
  if(!x.{core::Object::==}(y)) {
    throw "Arguments were supposed to be identical.";
  }
}
static method test1() → dynamic {
  core::Type v = #C1;
  self::expectEqual(#C1, v);
  self::expectEqual(v, #C1);
  self::expectEqual(#C1, con::v);
  self::expectEqual(con::v, #C1);
  self::expectEqual(#C1, #C1);
  core::Type vf1 = #C2;
  core::Type vf2 = #C2;
  core::Type vf3 = #C2;
  core::Type vf4 = #C2;
  core::Type oovf1 = #C2;
  core::Type oovf2 = #C2;
  core::Type oovf3 = #C2;
  core::Type oovf4 = #C2;
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, vf1);
  self::expectEqual(vf1, vf2);
  self::expectEqual(vf2, vf3);
  self::expectEqual(vf3, vf4);
  self::expectEqual(vf4, oovf1);
  self::expectEqual(oovf1, oovf2);
  self::expectEqual(oovf2, oovf3);
  self::expectEqual(oovf3, oovf4);
  self::expectEqual(oovf4, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  self::expectEqual(#C2, #C2);
  return #C5;
}
static method main() → dynamic {
  self::test1();
}

library;
import self as con;
import "dart:core" as core;

import "dart:async";

typedef F1 = () →* con::A<FutureOr<dynamic>*>*;
typedef F2 = () →* con::A<dynamic>*;
typedef F3 = () →* con::A<FutureOr<FutureOr<dynamic>*>*>*;
typedef F4 = () →* con::A<dynamic>*;
class A<X extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → con::A<con::A::X*>*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static const field core::Type* c = #C1;
static field core::Type* v = #C1;
static const field con::A<core::List<() →* con::A<FutureOr<dynamic>*>*>*>* a1 = #C6;
static const field con::A<core::List<() →* con::A<dynamic>*>*>* a2 = #C6;
static const field con::A<core::List<() →* con::A<FutureOr<FutureOr<dynamic>*>*>*>*>* a3 = #C6;
static const field con::A<core::List<() →* con::A<dynamic>*>*>* a4 = #C6;

constants  {
  #C1 = TypeLiteralConstant(con::A<dynamic>*)
  #C2 = TypeLiteralConstant(() →* con::A<dynamic>*)
  #C3 = 42
  #C4 = self::Check {_ignored:#C3}
  #C5 = <dynamic>[#C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4]
  #C6 = con::A<core::List<() →* con::A<dynamic>*>*> {}
}


Constructor coverage from constants:
org-dartlang-testcase:///const_canonical_type.dart:
- A. (from org-dartlang-testcase:///const_canonical_type_lib.dart:10:9)
- Check. (from org-dartlang-testcase:///const_canonical_type.dart:11:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

org-dartlang-testcase:///const_canonical_type_lib.dart:
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- A. (from org-dartlang-testcase:///const_canonical_type_lib.dart:10:9)
