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){(core::num) → core::int}, 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::==}{(core::Object) → core::bool} 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)
