library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   a == c_dynamic; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   a == c_int; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   a == c_string; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   a == d; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   b == c_dynamic; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   b == c_int; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   b == c_string; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   b == d; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_dynamic == a; // error
//                ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>'.
//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_dynamic == b; // error
//                ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_int == a; // error
//            ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_int == b; // error
//            ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_int == c_string; // error
//            ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_string == a; // error
//               ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>'.
//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_string == b; // error
//               ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_string == c_int; // error
//               ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>'.
//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   c_string == d; // error
//               ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   d == a; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   d == b; // error
//        ^
//
// pkg/front_end/testcases/general/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
//   d == c_string; // error
//        ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  operator ==(covariant-by-declaration self::A* other) → core::bool*
    return true;
  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 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
}
class B extends self::A {
  synthetic constructor •() → self::B*
    : super self::A::•()
    ;
  operator ==(covariant-by-declaration self::A* other) → core::bool*
    return true;
}
class C<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T*>*
    : super core::Object::•()
    ;
  operator ==(covariant-by-declaration covariant-by-class self::C<self::C::T*>* other) → core::bool*
    return true;
  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 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
}
class D extends self::C<core::int*> {
  synthetic constructor •() → self::D*
    : super self::C::•()
    ;
}
static method main() → dynamic {}
static method test(self::A* a, self::B* b, self::C<dynamic>* c_dynamic, self::C<core::int*>* c_int, self::C<core::String*>* c_string, self::D* d) → dynamic {
  a =={self::A::==}{(self::A*) →* core::bool*} a;
  a =={self::A::==}{(self::A*) →* core::bool*} b;
  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  a == c_dynamic; // error
       ^" in c_dynamic as{TypeError} self::A*;
  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  a == c_int; // error
       ^" in c_int as{TypeError} self::A*;
  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  a == c_string; // error
       ^" in c_string as{TypeError} self::A*;
  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
 - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  a == d; // error
       ^" in d as{TypeError} self::A*;
  b =={self::B::==}{(self::A*) →* core::bool*} a;
  b =={self::B::==}{(self::A*) →* core::bool*} b;
  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  b == c_dynamic; // error
       ^" in c_dynamic as{TypeError} self::A*;
  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  b == c_int; // error
       ^" in c_int as{TypeError} self::A*;
  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  b == c_string; // error
       ^" in c_string as{TypeError} self::A*;
  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
 - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  b == d; // error
       ^" in d as{TypeError} self::A*;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_dynamic == a; // error
               ^" in a as{TypeError} self::C<dynamic>*;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>'.
 - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_dynamic == b; // error
               ^" in b as{TypeError} self::C<dynamic>*;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_dynamic;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_int;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_string;
  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} d;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_int == a; // error
           ^" in a as{TypeError} self::C<core::int*>*;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
 - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_int == b; // error
           ^" in b as{TypeError} self::C<core::int*>*;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::int*>*;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_int;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_int == c_string; // error
           ^" in c_string as{TypeError} self::C<core::int*>*;
  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} d;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_string == a; // error
              ^" in a as{TypeError} self::C<core::String*>*;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>'.
 - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_string == b; // error
              ^" in b as{TypeError} self::C<core::String*>*;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::String*>*;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_string == c_int; // error
              ^" in c_int as{TypeError} self::C<core::String*>*;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} c_string;
  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>'.
 - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  c_string == d; // error
              ^" in d as{TypeError} self::C<core::String*>*;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
 - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  d == a; // error
       ^" in a as{TypeError} self::C<core::int*>*;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
 - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  d == b; // error
       ^" in b as{TypeError} self::C<core::int*>*;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::int*>*;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_int;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
 - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
  d == c_string; // error
       ^" in c_string as{TypeError} self::C<core::int*>*;
  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} d;
}
