library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/built_in_types.dart:43:18: Error: A value of type 'bool' can't be assigned to a variable of type 'BoolET'.
//   BoolET b2 = e2 == e2; /* Error */
//                  ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends core::Object implements self::A {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  @#C1
  get hashCode() → self::IntET /* erasure=core::int */
    return self::IntET|constructor#(super.{core::Object::hashCode});
  @#C1
  get runtimeType() → self::TypeET /* erasure=core::Type */
    return self::TypeET|constructor#(super.{core::Object::runtimeType});
  @#C1
  operator ==(core::Object? other) → self::BoolET /* erasure=core::bool */
    return self::BoolET|constructor#(other =={core::Object::==}{(core::Object) → core::bool} this);
}
extension type ET1(self::B b) implements self::A {
  abstract extension-type-member representation-field get b() → self::B;
  constructor • = self::ET1|constructor#;
  constructor tearoff • = self::ET1|constructor#_#new#tearOff;
}
extension type ET2(self::B b) implements self::ET1 /* erasure=self::B */, self::B {
  abstract extension-type-member representation-field get b() → self::B;
  constructor • = self::ET2|constructor#;
  constructor tearoff • = self::ET2|constructor#_#new#tearOff;
}
extension type IntET(core::int i) implements core::int {
  abstract extension-type-member representation-field get i() → core::int;
  constructor • = self::IntET|constructor#;
  constructor tearoff • = self::IntET|constructor#_#new#tearOff;
}
extension type TypeET(core::Type t) implements core::Type {
  abstract extension-type-member representation-field get t() → core::Type;
  constructor • = self::TypeET|constructor#;
  constructor tearoff • = self::TypeET|constructor#_#new#tearOff;
}
extension type BoolET(core::bool b) implements core::bool {
  abstract extension-type-member representation-field get b() → core::bool;
  constructor • = self::BoolET|constructor#;
  constructor tearoff • = self::BoolET|constructor#_#new#tearOff;
}
static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* erasure=self::B */ {
  lowered final self::ET1 /* erasure=self::B */ #this = b;
  return #this;
}
static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* erasure=self::B */
  return self::ET1|constructor#(b);
static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* erasure=self::B */ {
  lowered final self::ET2 /* erasure=self::B */ #this = b;
  return #this;
}
static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* erasure=self::B */
  return self::ET2|constructor#(b);
static extension-type-member method IntET|constructor#(core::int i) → self::IntET /* erasure=core::int */ {
  lowered final self::IntET /* erasure=core::int */ #this = i;
  return #this;
}
static extension-type-member method IntET|constructor#_#new#tearOff(core::int i) → self::IntET /* erasure=core::int */
  return self::IntET|constructor#(i);
static extension-type-member method TypeET|constructor#(core::Type t) → self::TypeET /* erasure=core::Type */ {
  lowered final self::TypeET /* erasure=core::Type */ #this = t;
  return #this;
}
static extension-type-member method TypeET|constructor#_#new#tearOff(core::Type t) → self::TypeET /* erasure=core::Type */
  return self::TypeET|constructor#(t);
static extension-type-member method BoolET|constructor#(core::bool b) → self::BoolET /* erasure=core::bool */ {
  lowered final self::BoolET /* erasure=core::bool */ #this = b;
  return #this;
}
static extension-type-member method BoolET|constructor#_#new#tearOff(core::bool b) → self::BoolET /* erasure=core::bool */
  return self::BoolET|constructor#(b);
static method test() → void {
  self::ET2 /* erasure=self::B */ e2 = self::ET2|constructor#(new self::B::•());
  self::ET1 /* erasure=self::B */ e1 = e2;
  core::int hc1 = e1.{core::Object::hashCode}{core::int};
  self::IntET /* erasure=core::int */ hc2 = e2.{self::B::hashCode}{self::IntET /* erasure=core::int */};
  core::Type t1 = e1.{core::Object::runtimeType}{core::Type};
  self::TypeET /* erasure=core::Type */ t2 = e2.{self::B::runtimeType}{self::TypeET /* erasure=core::Type */};
  core::bool b1 = e1 =={core::Object::==}{(core::Object) → core::bool} e1;
  self::BoolET /* erasure=core::bool */ b2 = invalid-expression "pkg/front_end/testcases/extension_types/built_in_types.dart:43:18: Error: A value of type 'bool' can't be assigned to a variable of type 'BoolET'.
  BoolET b2 = e2 == e2; /* Error */
                 ^" in (e2 =={self::B::==}{(core::Object?) → self::BoolET /* erasure=core::bool */} e2) as{TypeError} self::BoolET /* erasure=core::bool */;
}

constants  {
  #C1 = core::_Override {}
}
