//
// Problems in component:
//
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:37:16: Error: Case expression 'D {}' does not have a primitive operator '=='.
//  - 'D' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
//     case const D(42): // Error: D has custom operator ==.
//                ^
//
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:39:10: Error: Case expression 'D {}' does not have a primitive operator '=='.
//  - 'D' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
//     case x: // Error: D has custom operator ==.
//          ^
//
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:35:16: Error: Type 'A' of the case expression is not a subtype of type 'B' of this switch expression.
//  - 'A' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
//  - 'B' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
//     case const A(42): // Error: not a subtype of B.
//                ^
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:30:11: Context: The switch expression is here.
//   switch (b) {
//           ^
//
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:39:10: Error: Type 'dynamic' of the case expression is not a subtype of type 'B' of this switch expression.
//  - 'B' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
//     case x: // Error: D has custom operator ==.
//          ^
// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:30:11: Context: The switch expression is here.
//   switch (b) {
//           ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object /*hasConstConstructor*/  {
  final field core::int foo;
  const constructor •(core::int foo) → self::A
    : self::A::foo = foo, super core::Object::•()
    ;
}
class B extends self::A /*hasConstConstructor*/  {
  const constructor •(core::int foo) → self::B
    : super self::A::•(foo)
    ;
}
class C extends self::B /*hasConstConstructor*/  {
  const constructor •(core::int foo) → self::C
    : super self::B::•(foo)
    ;
}
class D extends self::B /*hasConstConstructor*/  {
  const constructor •(core::int foo) → self::D
    : super self::B::•(foo)
    ;
  operator ==(dynamic other) → core::bool
    return core::identical(this, other);
}
static method bar(self::B b) → dynamic {
  #L1:
  switch(b) {
    #L2:
    case #C2:
      {
        break #L1;
      }
    #L3:
    case #C3:
      {
        break #L1;
      }
    #L4:
    case #C4:
      {
        break #L1;
      }
    #L5:
    case #C5:
      {
        break #L1;
      }
    #L6:
    case #C7:
      {
        break #L1;
      }
    #L7:
    default:
      {}
  }
}
static method main() → dynamic {}

constants  {
  #C1 = 42
  #C2 = self::B {foo:#C1}
  #C3 = self::C {foo:#C1}
  #C4 = self::A {foo:#C1}
  #C5 = self::D {foo:#C1}
  #C6 = 123
  #C7 = self::D {foo:#C6}
}
