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

import "dart:async";

typedef F1 = () → self::A<FutureOr<dynamic>>;
typedef F2 = () → self::A<dynamic>;
typedef F3 = () → self::A<FutureOr<FutureOr<dynamic>?>>;
typedef F4 = () → self::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::•()
    ;
}
class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::A<self::A::X%>
    : 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, #C1);
  self::expectEqual(#C1, #C1);
  self::expectEqual(#C1, #C1);
  self::expectEqual(v, v);
  self::expectEqual(v, #C1);
  core::Type vf1 = #C2;
  core::Type vf2 = #C2;
  core::Type vf3 = #C2;
  core::Type vf4 = #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);
  return #C5;
}
static method main() → dynamic {
  self::test1();
}

constants  {
  #C1 = TypeLiteralConstant(self::A<dynamic>*)
  #C2 = TypeLiteralConstant(() →* self::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]
}


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