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

import "org-dartlang-testcase:///constants_lib.dart" as lib;

typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
static const field core::Type objectTypeLiteral = #C1;
static const field (core::int) → core::int partialInstantiation = #C3;
static const field con::Class<core::int> instance = #C5;
static const field core::Type functionTypeLiteral = #C6;
static const field core::Type genericFunctionTypeLiteral = #C7;
static const field core::List<core::int> listLiteral = #C8;
static const field core::Set<core::int> setLiteral = #C12;
static const field core::Map<core::int, core::String> mapLiteral = #C15;
static const field core::List<core::int> listConcatenation = #C8;
static const field core::Set<core::int> setConcatenation = #C12;
static const field core::Map<core::int, core::String> mapConcatenation = #C15;
static const field core::bool objectTypeLiteralIdentical = #C16;
static const field core::bool partialInstantiationIdentical = #C16;
static const field core::bool instanceIdentical = #C16;
static const field core::bool functionTypeLiteralIdentical = #C16;
static const field core::bool genericFunctionTypeLiteralIdentical = #C16;
static const field core::bool listLiteralIdentical = #C16;
static const field core::bool setLiteralIdentical = #C16;
static const field core::bool mapLiteralIdentical = #C16;
static const field core::bool listConcatenationIdentical = #C16;
static const field core::bool setConcatenationIdentical = #C16;
static const field core::bool mapConcatenationIdentical = #C16;
static final field core::bool inStrongMode = self::_inStrongMode();
static method _inStrongMode() → core::bool {
  return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
}
static method main() → dynamic {
  self::test(#C1, #C18);
  self::test(#C3, #C19);
  self::test(#C5, #C20);
  self::test(#C6, #C21);
  self::test(#C7, #C22);
  self::test(#C8, #C23);
  self::test(#C12, #C25);
  self::test(#C15, #C26);
  self::test(#C8, #C23);
  self::test(#C12, #C25);
  self::test(#C15, #C26);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
  self::test(true, #C16);
}
static method test(dynamic expected, dynamic actual) → dynamic {
  core::print("test(${expected}, ${actual})");
  if(self::inStrongMode) {
    if(core::identical(expected, actual)) {
      throw "Unexpected identical for ${expected} and ${actual}";
    }
  }
  else {
    if(!core::identical(expected, actual)) {
      throw "Expected ${expected}, actual ${actual}";
    }
  }
}

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

typedef F1<invariant T extends core::Object* = dynamic> = (T*) →* T*;
typedef F2 = <T extends core::Object* = dynamic>(T*) →* T*;
class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
  final field con::Class::T* field;
  const constructor •(con::Class::T* field) → con::Class<con::Class::T*>*
    : con::Class::field = field, super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static const field core::Type* objectTypeLiteral = #C18;
static const field (core::Object*, core::Object*) →* core::bool* c2 = #C27;
static const field (core::int*) →* core::int* partialInstantiation = #C19;
static const field con::Class<core::int*>* instance = #C20;
static const field core::Type* functionTypeLiteral = #C21;
static const field core::Type* genericFunctionTypeLiteral = #C22;
static const field core::List<core::int*>* listLiteral = #C23;
static const field core::Set<core::int*>* setLiteral = #C25;
static const field core::Map<core::int*, core::String*>* mapLiteral = #C26;
static const field core::List<core::int*>* listConcatenation = #C23;
static const field core::Set<core::int*>* setConcatenation = #C25;
static const field core::Map<core::int*, core::String*>* mapConcatenation = #C26;
static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
  return t;

constants  {
  #C1 = TypeLiteralConstant(core::Object)
  #C2 = tearoff con::id
  #C3 = partial-instantiation con::id <core::int>
  #C4 = 0
  #C5 = con::Class<core::int> {field:#C4}
  #C6 = TypeLiteralConstant((dynamic) → dynamic)
  #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
  #C8 = <core::int>[#C4]
  #C9 = null
  #C10 = <dynamic>[#C4, #C9]
  #C11 = core::_ImmutableMap<core::int, core::Null?> {_kvPairs:#C10}
  #C12 = col::_UnmodifiableSet<core::int> {_map:#C11}
  #C13 = "foo"
  #C14 = <dynamic>[#C4, #C13]
  #C15 = core::_ImmutableMap<core::int, core::String> {_kvPairs:#C14}
  #C16 = false
  #C17 = <core::int?>[]
  #C18 = TypeLiteralConstant(core::Object*)
  #C19 = partial-instantiation con::id <core::int*>
  #C20 = con::Class<core::int*> {field:#C4}
  #C21 = TypeLiteralConstant((dynamic) →* dynamic)
  #C22 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
  #C23 = <core::int*>[#C4]
  #C24 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
  #C25 = col::_UnmodifiableSet<core::int*> {_map:#C24}
  #C26 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
  #C27 = tearoff core::identical
}
