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

class A<T extends core::Object* = dynamic> extends core::Object {
  covariant-by-class field core::List<self::A::T*>* x = null;
  synthetic constructor •() → self::A<self::A::T*>*
    : super core::Object::•()
    ;
  set y(covariant-by-class core::List<self::A::T*>* value) → void {}
  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 method test() → dynamic {
  self::A<core::int*>* a_int = new self::A::•<core::int*>();
  self::A<core::Object*>* a_object = new self::A::•<core::Object*>();
  self::A<dynamic>* a_dynamic = new self::A::•<dynamic>();
  core::List<core::int*>* x_int = a_int.{self::A::x} = <core::int*>[0];
  core::List<core::int*>* y_int = a_int.{self::A::y} = <core::int*>[0];
  core::List<core::Object*>* x_object = a_object.{self::A::x} = <core::Object*>[0];
  core::List<core::Object*>* y_object = a_object.{self::A::y} = <core::Object*>[0];
  core::List<dynamic>* x_dynamic = a_dynamic.{self::A::x} = <dynamic>[0];
  core::List<dynamic>* y_dynamic = a_dynamic.{self::A::y} = <dynamic>[0];
  core::List<core::int*>* x_int_explicit = a_int.{self::A::x} = <core::int*>[0];
  core::List<core::int*>* y_int_explicit = a_int.{self::A::y} = <core::int*>[0];
  core::List<core::int*>* x_object_explicit = a_object.{self::A::x} = <core::int*>[0];
  core::List<core::int*>* y_object_explicit = a_object.{self::A::y} = <core::int*>[0];
  core::List<core::int*>* x_dynamic_explicit = a_dynamic.{self::A::x} = <core::int*>[0];
  core::List<core::int*>* y_dynamic_explicit = a_dynamic.{self::A::y} = <core::int*>[0];
  core::List<core::int*>* x_int_downward = a_int.{self::A::x} = <core::int*>[0];
  core::List<core::int*>* y_int_downward = a_int.{self::A::y} = <core::int*>[0];
  core::List<core::int*>* x_object_downward = (a_object.{self::A::x} = <core::Object*>[0]) as{TypeError} core::List<core::int*>*;
  core::List<core::int*>* y_object_downward = (a_object.{self::A::y} = <core::Object*>[0]) as{TypeError} core::List<core::int*>*;
  core::List<core::int*>* x_dynamic_downward = (a_dynamic.{self::A::x} = <dynamic>[0]) as{TypeError} core::List<core::int*>*;
  core::List<core::int*>* y_dynamic_downward = (a_dynamic.{self::A::y} = <dynamic>[0]) as{TypeError} core::List<core::int*>*;
}
static method main() → dynamic {}
